深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)

2023-05-16

深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)

  • 唯一索引/非唯一索引
  • 主键索引(主索引)
  • 聚集索引/非聚集索引
  • 组合索引

唯一索引/非唯一索引

唯一索引

1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

非唯一索引

2.非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

主键索引(主索引)

3.主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索引 。一个表只能建立一个主索引。

聚集索引/非聚集索引

4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。

扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用?

聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。

聚集索引的表中记录的物理顺序与索引的排列顺序一致

优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。

缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效。

建议使用聚集索引的场合为:
A.某列包含了小数目的不同值。
B.排序和范围查找。

非聚集索引的记录的物理顺序和索引的顺序不一致

其他方面的区别:
1.聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用中的记录在叶子层包含一个指向表数据页中的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点。

2.非聚集索引添加记录时,不会引起数据顺序的重组。

看上去聚簇索引的效率明显要低于非聚簇索引, 因为每次使用辅助索引检索都要经过两次 B+树查找, 这不是多此一举吗? 聚簇索引的优势在哪?

1.由于行数据和叶子节点存储在一起, 这样主键和行数据是一起被载入内存的, 找到叶子节点就可以立刻将行数据返回了, 如果按照主键 Id 来组织数据, 获得数据更快。

2.辅助索引使用主键作为"指针", 而不是使用地址值作为指针的好处是, 减少了当出现行移动或者数据页分裂时,辅助索引的维护工作, InnoDB 在移动行时无须更新辅助索引中的这个"指针"。 也就是说行的位置会随着数据库里数据的修改而发生变化, 使用聚簇索引就可以保证不管这个主键 B+树的节点如何变化, 辅助索引树都不受影响。

建议使用非聚集索引的场合为:
a.此列包含了大数目的不同值;
b.频繁更新的列

5.组合索引(联合索引)

基于多个字段而创建的索引就称为组合索引。

创建索引
create index idx1 on table1(col1,col2,col3)
查询
select * from table1 where col1= A and col2= B and col3 = C

组合索引查询的各种场景
组合索引 Index (A, B, C)

下面条件可以用上该组合索引查询:
 A>5
 A=5 AND B>6
 A=5 AND B=6 AND C=7
 A=5 AND B=6 AND C IN (2, 3)

下面条件将不能用上组合索引查询:
 B>5 ——查询条件不包含组合索引首列字段
 B=6 AND C=7 ——理由同上

下面条件将能用上部分组合索引查询(重要! ! ! ! ) :
 A>5 AND B=2 ——当范围查询使用第一列, 查询条件仅仅能使
用第一列
 A=5 AND B>6 AND C=2 ——范围查询使用第二列, 查询条件仅仅能使用
前二列
 A=5 AND B IN (2, 3) AND C=2 ——理由同上

组合索引排序的各种场景:

兹有组合索引 Index(A,B)。
 下面条件可以用上组合索引排序:
 ORDER BY A——首列排序
 A=5 ORDER BY B——第一列过滤后第二列排序
 ORDER BY A DESC, B DESC——注意, 此时两列以相同顺序排序
 A>5 ORDER BY A——数据检索和排序都在第一列

下面条件不能用上组合索引排序:
 ORDER BY B ——排序在索引的第二列
 A>5 ORDER BY B ——范围查询在第一列, 排序在第二列
 A IN(1,2) ORDER BY B ——理由同上
 ORDER BY A ASC, B DESC ——注意, 此时两列以不同顺序排序

alter table users add index lname_fname_age(lname,fname,age);

创建了 lname_fname_age 多列索引,相当于创建了(lname)单列索引,
(lname,fname)联合索引以及(lname,fname,age)联合索引。

举例说明:上面给出一个多列索引(username,password,last_login),当
三 列 在 where 中 出 现 的 顺 序 如 (username,password,last_login) 、
(username,password)、(username)才能用到索引,如下面几个顺序
(password,last_login) 、 (passwrod) 、 (last_login)--- 这 三 者 不 从
username 开始,(username,last_login)---断层,少了 password,都无
法利用到索引。因为 B+tree 多列索引保存的顺序是按照索引创建的顺序,
检索索引时按照此顺序检索。



作者:六尺帐篷
链接:https://www.jianshu.com/p/f49ee80c4956
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引) 的相关文章

  • VSFTP服务器使用retrieveFileStream返回null的问题

    VSFTP服务器使用retrieveFileStream返回null的问题 最近在使用vsftp在文件存储服务 xff0c 发现使用retrieveFileStream获取文件流的时候 xff0c 怎么获取都是空的 xff0c 网上有说返回
  • Android常用的一些make命令

    1 make jX X表示数字 xff0c 这个命令将编译Android系统并生成镜像 xff0c XX表示可以使用到的CPU核数 xff0c 这在配置好的电脑上特别有用 xff0c 公司的16核ubuntu服务器执行make j16只要不
  • 建造者模式详解

    建造者模式 建造者模式 xff08 Bulider Pattern xff09 是将一个复杂对象的构建过程与它的实现表示分离 xff0c 使得同样的构建过程可以创建不同的表示 xff0c 属于创建型模式 使用创建者模式对于用户而言只需要制定
  • LAMP架构简述

    目录 一 LAMP架构简述 二 各组件作用 三 构建LAMP平台 3 1编译安装Apache httpd服务 3 1 1 关闭防火墙 xff0c 将安装Apache所需软件包转到 opt目录下 3 1 2 安装环境依赖包 3 1 3 设置安
  • SLF4J源码分析

    介绍 官网 xff1a http www slf4j org github xff1a https github com qos ch slf4j SLF4J xff08 Simple Logging Facade for Java xff
  • ssh指定密码登陆远程服务器

    1 ssh远程登录 ssh登录远程服务器 xff0c 一般都通过ssh key方式免密码登陆 xff1b 也可以指定用户名 密码来登陆远程服务器 xff1b 如下 xff1a ssh IP l user p port 或者 ssh user
  • U盘制作ubuntu18.04.6系统安装盘

    U盘制作ubuntu18 04 6系统安装盘 1 1 下载镜像文件 ubuntu 18 04 6 desktop amd64 iso 2 下载u盘制作工具rufus3 15 3 运行rufus3 1 制作unbutun18 04启动U盘 3
  • Gradle全版本资源下载

    使用说明 1 xff0c 官网下载地址https services gradle org distributions 不同版本更改版本号即可 xff0c 官网下载不成功的 xff0c 嫌官网下载速度慢的 xff0c 可以直接在这里下载 2
  • .sh文件无法运行--权限问题

    下载了 sh后缀名脚本 结果双击安装文件时是用gedit打开 试着从终端打开 xff0c 提示 xff1a command not found 最后发现原来是文件的打开权限没有钩选 允许以程序执行文件 在图形界面下无法修改权限 xff0c
  • Android 遇坑之路及解决方案

    一 在状态栏之上弹自定义吐司 1 需求 xff1a UI设计师设计的原型图是在状态栏之上的位置弹一个自定义吐司 xff0c 我们的应用内全部都是沉浸式状态栏 xff0c 将状态栏隐藏掉了的 2 解决方案 xff1a 首先给toast设置ma
  • SCRUM框架包括3个角色、3个工件、5个活动、5个价值

    转自http www scrumcn com agile scrum knowledge library scrum html SCRUM 是一个用于开发和维持复杂产品的框架 Scrum 是一个用于开发和维持复杂产品的框架 xff0c 是一
  • rpm安装mysql报libc.so.X(GLIBC_XXX)(64bit) is needed by

    这个原因和linux本身自带的glibc版本不符合安装要求 xff0c 可以对glibc进行升级 解压 xff1a tar xvf glibc XXX tar gz进入glibc 2 14目录 xff1a cd glibc XXXX创建bu
  • rpm安装mysql

    引言 之前安装mysql都是直接使用tar包安装 xff0c 没有用过rpm xff0c 今天搞了一台腾讯云服务器 xff0c 所以想尝试一种新的安装mysql的方式 xff0c 下面分享安装过程和遇到的问题 第一 下载rpm包 官网地址
  • SpringBoot整合多数据源(Druid+Mybaties)

    SpringBoot整合多数据源 xff08 Druid 43 Mybaties xff09 1 添加pom文件 二 改yml 三 业务代码 1 mapper层 xff0c 注意要将不同库的Mapper xml文件分别存放不同的目录 xff
  • 浏览器 中设置断点调试

    1 xff1a 点击F12进入代码调试页面 xff0c 然后点击source xff0c 点击需要设置断点的地方 xff0c F5刷新 2 xff1a F11向下面执行一步 3 xff1a F10向上面执行一步
  • SpringBoot整合Mybaties

    一 引入pom 1 引入jdbc starter xff0c mybatis starter xff0c mysql connector 二 改yml yml的配置如下 xff1a 千万注意那块儿mapper的映射路径的后缀必须是Mappe
  • 国内下载centos的镜像网站大全

    http isoredirect centos org centos 7 isos x86 64 https blog 51cto com 14260602 2441705
  • Shiro实战以及源码解析

    一 明白什么是认证和授权 从百度百科上理解的 xff0c 感觉非常通俗易懂 你要登机 xff0c 你需要出示你的 passport 和源 ticket xff0c passport 是为了证明你张三确实是你百张三 xff0c 这就是 认证
  • 谈谈你对深拷贝和浅拷贝的理解-Java

    一 区别 1 深拷贝中既要拷贝基本数据类型也要拷贝引用类型的数据 xff0c 也就是说拷贝一份完全一样的对象 2 浅拷贝中之拷贝基本数据类型 xff0c 引用类型的数据只是拷贝了原来的引用 xff0c 并没有把引用的数据也拷贝 二 方式 1
  • 谈谈你对依赖注入(DI)和控制反转(IoC)的理解

    学习过Spring框架的人一定都会听过Spring的IoC 控制反转 DI 依赖注入 这两个概念 xff0c 对于初学Spring的人来说 xff0c 总觉得IoC DI这两个概念是模糊不清的 xff0c 是很难理解的 xff0c 今天和大

随机推荐

  • Guava Cache应用以及源码解析

    Guava Cache的学习 https github com google guava 一 Guava的适用性 二 两种缓存的加载 1 第一种CacheLoader方式 xff0c 返回的是LoadingCache对象 xff0c 这个对
  • java邮箱激活

    一 分析 xff1a 1 xff1a 先从前端接收到一个邮箱帐号 xff0c 由于鲁棒性的要求 xff0c 在发送邮箱之前邮箱格式必须正确 xff01 xff01 不然的话第一发送不了 xff0c 第二会发生错误 xff0c 出现异常 所以
  • 解决Count and Say

    一 题目 xff1a The count and say sequence is the sequence of integers with the first five terms as following 1 1 2 11 3 21 4
  • 大数据概述

    一 大数据定义 量大 复杂 二 四个特征以及应用场景 三 大数据技术 1 展现与交互 报表 图形 可视化工具 增强现实 2 数据计算 查询 统计 分析 预测 挖掘 图谱 BI 3 数据存储 分布式文件系统 xff0c 分布式数据库 4 数据
  • hdfs的理解以及shell命令

    一 hdfs的实现思想 xff1a 1 hdfs是利用分布式集群来存储文件的 xff0c 为客户端提供一个便捷的访问方式 xff0c 就是一个虚拟的目录结构 2 文件存储的时候是被分割成若干的block块的 3 文件的bloc块存放在若干台
  • js中的prop()和attr()方法

    以下两种方法等价 xff1a span class token operator lt span input id span class token operator 61 span span class token string 34 t
  • iOS富文本(NSAttributedString)---尽力弄全了

    把简书文章搬过来 最近浮躁 xff0c 毛线都没写 xff0c 不断有人关注点赞我 xff0c 必须总结点干货了 项目上要加载html格式的文本 xff0c 学习一下富文本相关内容 1 加载HTML标签文本 因为解析的数据里面有html标签
  • $ is not defined之SpringMVC中关于jsp中的ajax连接不到controller的问题

    刚刚写完jsp中的ajax xff0c 发现Controller路径名称以及取得的参数取得都正确 xff0c 文本域中的触发函数也正确 xff0c 可就是触发onblur方法的时候 xff0c 发现Controller并没有反应 经过调试后
  • codem2018年初赛A轮

    第六题 小美创建了一套算法 xff0c 第一行输入两个整数 xff0c a和b xff0c 第二行输入一个字符串c 假如a b的小数部分中包含第三个输入的数c xff0c 则输出c在小数部分出现的位置k xff0c 如果不包含 xff0c
  • 接口和抽象类的区别

    在interface里面的变量都是public static final 的 所以你可以这样写 xff1a public static final int i 61 10 或则 int i 61 10 xff1b xff08 可以省略掉一部
  • 动态代理

    动态代理是在不改变原来方法的代码的前提下 xff0c 用来增强原来方法的功能的 在程序的角度上来说 xff0c 就是说让别人来帮助自己完成更加强的功能 xff0c 别人就是动态代理对象 java中的动态代理由两个核心的组件来完成 xff0c
  • 数据库的读写分离和负载均衡

    mysql的数据库读写分离是为了要解决如何在复制集群的不同角色上 xff0c 去执行不同的sql语句 读尽量分布到从服务器上 xff0c 写只能在主服务器上 读的负载均衡则是解决如何在相同的从服务器上分担相同的sql语句的问题 读的负载均衡
  • NIO,BIO,AIO的区别和联系

    一个IO操作其实分成了两个步骤 xff1a 发起IO请求和实际的IO操作 IO操作可以分为3类 xff1a 同步阻塞 xff08 即早期的IO操作 xff09 同步非阻塞 xff08 NIO xff09 异步 xff08 AIO xff09
  • springmvc中文件的上传和下载

    步骤 xff1a 1 在前端的form表单中申明enctype 61 34 multipart form data 34 2 在前端的文件区域设置yourfile lt input type 61 34 file 34 name 61 34
  • git的使用

    管理员从master分支创建develop分支用于开发 git checkout b develop RD从远程仓库pull最新的develop分支 xff0c 并拉个feature分支用于需求开发 git pull origin deve
  • JAVA内存模型剖析

    java内存模型剖析 xff1a A xff1a 内存模型是什么鬼 xff1a 一 cpu和缓存一致性 计算机中cpu要和数据打交道 xff0c 而数据往往是放到主存中去的 xff0c 所以就可以理解成cpu和主存打交道 随着cpu的不断优
  • mybatis学习

    mybatis学习 xff1a 一 jdbc存在的问题 xff1a 1 频繁创建链接 xff0c 造成系统资源的浪费 2 sql语句死板 xff0c 造成sql语句硬编码的问题 3 代码太繁琐 xff0c 维护难 二 mybatis学习改进
  • mysql中Access denied(using password:NO)问题解决

    我使用mysql启动命令启动了mysql后发现了下面错误 这个错误是因为前期我没有对数据库设置密码 xff0c 这里进入mysql报了错误 经过网上查找 xff0c 下面的步骤成功解决了我的问题 在安装mysql的文件夹下找到my int这
  • cas解析

    JAVA CAS原理 unsafe AQS concurrent包的实现 由于java的CAS同时具有 volatile 读和volatile写的内存语义 xff0c 因此Java线程之间的通信现在有了下面四种方式 xff1a A线程写vo
  • 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)

    深入理解四种数据库索引类型 xff08 唯一索引 非唯一索引 主键索引 xff08 主索引 xff09 聚集索引 非聚集索引 组合索引 xff09 唯一索引 非唯一索引主键索引 xff08 主索引 xff09 聚集索引 非聚集索引组合索引