MySQL索引

我的未来我决定 提交于 2020-08-08 19:34:05

一.什么是索引

索引是一种数据结构,能够帮助我们快速的检索数据库中的数据。

二.相关概念

1.索引分类

1)从存储结构上划分:
哈希索引
Btree索引

2)从应用层次上划分:
普通索引:一个索引只包含一列数据
唯一索引:索引值必须唯一,可以有空值
复合(联合)索引:包含多个列的索引

3)从存储方式上划分:
聚集索引:表中数据的顺序和索引顺序一致
非聚集索引:和索引不一致

2.聚集索引和非聚集索引

聚集索引和非聚集索引并不是真正的索引类型,而是一种数据存储的方式。InnoDB用的是聚集索引,而myISAM用的是非聚集索引

简单来说,聚集索引就是以主键创建的索引,又称为主键索引。一张数据表只能建立一个聚集索引,而该表中数据的排序方式和索引排序方式相同。它的底层是B+树,叶子节点的data域就是行数据。

而非聚集索引是非主键建立的索引,一张表中可以有多个非聚集索引,像是普通索引,联合索引都属于非聚集索引,它的叶子节点存储的是索引值和主键,所以当一般查询时首先会查到对应的叶子节点,然后根据主键值去聚集索引中查找相应数据,这也称为回表(当然有特殊情况:覆盖索引)。
覆盖索引:对要查询的列建立索引,这样一次查询到索引就是我们要找的数据了,不需要再去主键索引中查找。

三.底层结构

哈希索引:利用哈希算法,将键值转换为哈希值再来定位。

跟B+树相比:
1.只能进行等值查找,无法进行范围查找。而B+树支持区间查找。
2.无法利用索引进行排序。
3.不适用最左匹配原则,查询条件必须完全符合。
4.存在大量重复键时效率很低。

B-树索引:每个节点都存有数据,查找的时候从根节点开始二分查找。

跟B+树相比:
1.可以进行区间查找了,但是还是需要遍历全部节点。而B+树只需要遍历叶子节点即可。
2.查询效率不稳定,可能查找的非叶子节点就停止了。而B+树的数据都存在叶子节点中,所有查询的路径长度相同,查询效率是一定的。
3.磁盘读写代价更高。B树由于所有节点都有存储数据,非叶子节点能保存的叶子节点变少,要保存大量数据只能增加树的高度,那么IO操作会更多。

B+树索引:只有叶子节点才存储数据,并且之间有指针相连。

data域可以存放行数据(主键索引)或 主键值(非聚集索引)

四.InnoDB和MyISAM引擎中的索引实现

InnoDB:
  • 主键索引:
    既存储了索引又存储了行数据,查找时可以直接查找到数据。
  • 辅助索引(二级索引):
    叶子节点存储的是主键值,查找时需要进行回表或索引覆盖。
MyIASM:
  • 主键索引:
    采用非聚集索引,索引文件和数据文件是分开的,所以叶子节点存储的是指向数据的指针,查找时还需要去其他文件进行查找。
  • 辅助索引:
    结构上没有任何区别,但是主键索引要求key唯一,而辅助索引key可以重复。

五.最左匹配原则

当匹配数据时会先从最左边开始,例如联合索引(a,b,c)相当于创建了(a),(a,b),(a,b,c)三个索引。

Q:如果要建立联合索引,对索引的字段顺序是如何选择的呢?
A:我们会根据业务需求,对where字句中最频繁的一列放在最左边,因为MySQL索引符号最左匹配原则,当检索数据时会从最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引。

六..查询索引是否生效

通过explain去查看SQL执行计划。

ps:一条SQL语句的查询会有多种执行方案,而查询优化器会通过计算选出成本最低的方案,所以可能出现创建了多个索引而用到的只有一个或其中几个。

七.索引失效

1.违反最左匹配原则
2.模糊查询使用'%xxx'而不是'xxx%'
3.查询时对索引列用到计算'。函数等操作
4.使用不等于!=,>=,<=
.....一张图搞懂MySQL的索引失效


参考:
深入理解 MySQL 索引
面试经历:Mysql索引面试题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!