一、什么是索引?
正确的创建合适的索引是提升数据库查询性能的基础。
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。
二、为什么要用索引?
- 索引能极大的减少存储引擎需要扫描的数据量
- 索引可以把随机IO变成顺序IO
- 所以可以帮助我们在进行分组、排序等操作时,避免使用临时表
三、为什么是B+Tree
1、二叉查找树
- 最差情况可能形成链表结构
2、平衡二叉查找树
- 太深,数据处的深度决定了IO操作的次数,IO操作耗时大
- 太小,每一个磁盘块(节点/页)保存的数据量太小 ,没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作
3、多路平衡查找树B-Tree
- 数据在节点中,按页IO时查找的数据量会被非关键数据占用
- 查询速度不稳定,可能查找第一层数据之后就返回结果,也可能查找很多层数据之后返回
4、加强版多路平衡查找树B+Tree
- 只有叶子节点保存数据,所有查找都必须查找到叶子节点。
- 非叶子节点只存索引,一次按页IO的数据量会更大。
5、B+Tree与B-Tree的区别
- B+节点关键字搜索采用闭合区间
- B+非叶节点不保存数据相关信息,只保存关键字和子节点的引用
- B+关键字对应的数据保存在叶子节点中
- B+叶子节点是顺序排列的,并且相邻节点剧有顺序引用的关系
6、为什么选用B+Tree?
- B+树是B-树的变种,多路绝对平衡查找树,他拥有B-树的优势
- B+树扫库、表能力更强
- B+树的磁盘读写能力更强
- B+树的排序能力更强
- B+树的查询效率更加稳定
四、Mysql中B+Tree索引的体现形式
1、myisam引擎
- .myi文件存索引,.myd文件存数据
- 不同列上的关键字最后都得到的是一个指向.myd文件的地址
2、innodb引擎
- 以主键为索引来组织数据的存储
- 辅助索引得到主键索引的id
聚集索引-数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同
五、索引的应用
1、列的离散性count(distinct col):count(col)
离散型越高选择性就月好
2、最左匹配原则
对索引关键字进行计算(对比),一定是从左往右一次进行,且不可跳过
3、联合索引
单列索引
节点中关键字[name]
联合索引
节点中关键字[name,phone]
单列索引是特殊的联合索引
联合索引列选择原则
- 经常用的列优先[最左匹配原则]
- 选择性(离散度)高的列优先[离散度高原则]
- 宽度小的列优先[最小空间原则]
4、覆盖索引
如果查询列可通过索引节点中的关键字直接返回,则该索引称之为覆盖索引。
覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能。
5、总结
- 索引列的数据长度能少则少
- 索引一定不是越多越好,越全越好,一定是建合适的
- 匹配列浅醉可用到索引,like %9999%、like %9999%用不到索引,like 9999%在列离散度高的时候能用到索引,离散度低的时候用不到
- where条件中not in和<>操作无法使用索引
- 匹配范围值,order by也可用到索引
- 多用指定列查询,只返回自己想要的数据列,少用select *;
- 联合索引中如果不是按照索引最左列开始查找,无法使用索引
- 联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引
- 联合索引中如果查询中有某个列的范围查询,则其右边所有列都无法使用索引
网友评论