索引
将数据按字段值排好序存储,查找时可以根据排好序的数据快速定位到数据
索引的数据结构
红黑树
- 二叉树
- B树,B+树
-
B树(B-树)
叶子节点和非叶子节点都存储数据
- 索引数据不重复,每个节点(默认16KB)存储索引和数据,所以每个节点存储的数据比较少,节点就会增多,B树的深度就会比较大,查找数据时磁盘IO就比较多
-
B+树(B树变种)
只有叶子节点存储数据,非叶子节点只存储索引,深度比B树浅
-
Hash结构
对索引值进行hash计算,通过hash值计算出数据存储位置
hash结构只满足 “=”,“in”等搜索条件,不满足范围查询
索引类型
主键索引,根据主键自增值建立的索引结构
- 联合索引:在多个字段上建立索引,在第一个字段排好序的情况下对第二字段排序在对后面字段排序
- 聚簇索引:所有数据都在叶子节点
非聚簇索引:叶子节点只有索引值,需要进行回表才能查找出完整数据1
MySql常用存储引擎
MyIsam:使用的是非聚簇索引,通过找到索引值再回表找到数据具体位置再读取出来,表数据生成的文件是两个文件,一个索引文件,一个数据文件,5.7版本表有三个文件,索引文件,数据文件,表信息文件
InnoDb:使用的是聚簇索引,表数据按照B+树进行存储,根据索引树可以直接找到数据存储位置,5.7版本有两个文件,表数据文件和表信息文件,8.0只有一个文件了
最左前缀
在联合索引中,只有左边字段值排好序的情况下,右边字段才是有序的,使用联合索引时只能按顺序来,不能跳过,否则找的数据就有问题
索引下推
使用第一个索引字段使用 like 这种范围查找出来的数据会再根据后面字段过滤一下,这样会减少回表次数
