一、什么是索引
索引好比一本书的目录可以提高查询效率。
二、索引的分类
1.聚簇索引
2.主键索引
3.普通索引
4.索引覆盖
5.回表
6.索引下推
7.联合索引
8.唯一索引
9.最左匹配原则
- 聚簇索引:通过这棵树能找到所有的数据。主键索引=聚簇索引(innodb)但是(myISAM严格意义不是 会存在一个index指针去指向。.myd文件)
- 主键索引和普通索引
主键索引:是聚簇索引,索引的叶子节点是每个字段的数据
普通索引:索引的叶子节点挂的是主键id - 索引覆盖和回表
索引覆盖是一个现象,而回表是一个动作
索引覆盖:就是索引字段包含了要查询的字段。
回表:与索引覆盖互斥,索引字段含不全要查询的字段,然后通过回表来查询这个动作来找到所有的值。 - 联合索引和唯一索引
联合索引:通过多个索引组合,达到索引覆盖这个条件。好比age,name
先按照age,在按照name,排序,查询。
唯一索引:这个这列字段不能重复,一般用在id自增 - 索引下推和最左匹配原则
索引下推:mysql5.6之前没有索引下推,就是当索引失效的时候回全表扫描,而5.6之后,能用索引就用索引,减少全部扫描。
最左匹配原则:最左匹配原则只适用于复合索引,引匹配的一种优化策略。
三、索引失效场景?
1.like %ss
2. or 左边没有索引
3. 使用函数 max等
四、索引数据结构
数据结构是B+树。
矮胖 矮,减少io 每往下翻一层 都会进行一次磁盘IO,
数据都在叶子结点 用双向链表链接 支持范围查询 。
为什么索引不用hash? hash不支持范围查询