关于索引

索引是帮助MySQL高效获取数据的数据结构,降低数据库的IO成本。索引有两种实现方式,分别是B+树和Hash索引。虽然Hash索引相对来说查询效率更快,但是Innodb的索引默认是用B+树实现的。因为B+树支持范围索引。用B+树不用B树的原因主要是B+树因为采用了非叶子节点只存储指针,叶子节点存储数据,且叶子节点直接用双向链表链接,这使得B+树的高度更低,一般只有三层,磁盘读写代价更低。

聚集索引和非聚集索引

聚集索引:数据和索引放在一起,B+树的叶子节点保存了整行数据,有且只有一个
非聚集索引:数据和索引分开存储,B+树的叶子节点保存了主键值,可以有多个

回表查询

通过非聚集索引找到对应的主键值,到聚集索引中查找整行数据。

覆盖索引

在使用索引查询时需要返回的列可以在该索引中直接找到,不需要进行回表查询。

索引创建原则

1.数据量大且查询频繁的表
2.使用where,order by,group by等字段的表
3.选择区分度高的列作为索引,使用唯一索引
4.字段过长时可以针对字段特点创建索引
5.尽量使用联合索引,覆盖索引
6.控制索引数量,不是越多越好
7.若索引列不能存储null,则创建表时使用not null约束

索引失效

1.违反最左原则
2.在join时左表或右表有一个没使用索引
3.在sql语句中进行隐性数据转换
4.在索引上做运算操作
5.在索引上引用函数(在MySQL8中新增了函数索引解决此问题)
6.like语句中%在开头

from on join where group by having order by limit