索引是mysql为了更高效获取数据排好序的数据结构。
索引的数据结构
二叉树
红黑树
hash表
b-树
b-树
叶节点具有相同的深度,叶子节点的指针为空
所有索引元素不重复
节点中的索引从左到右依次递增
b+树(b-树的变种)
非叶子节点不存储数据,只存储索引冗余,可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指针连接提高空间访问的性能
hash
对索引的key进行一次hash计算就可以定位出数据存储的位置
很多时候hash比b+树 索引更高效
仅能满足 = in,不支持范围查找
hash冲突
MyISAM索引文件和数据文件是分离的(非聚集)
在本地文件中,有两个文件,一个是索引文件,索引文件存储的是索引和对应数据的指针,如果匹配到了,再根据指针去另外一个数据文件中取数据
InnoDB索引实现(聚集)
表数据文件本身就是按照b+树组织的一个索引文件
聚集索引叶子节点包含了完整的数据记录
为什么建议InnoDB表必须用建主键,并且推荐使用自增主键?
因为主键唯一能更好的生成索引,使用自增主键是为了在生成索引的时候能对其他节点的影响降到最小
为什么非主键索引结构叶子节点存储的是主键(一致性/节省存储空间)
一致性:当数据库做DML的时候索引指向的地址会发生变更,因为非主键索引指向的是主键,所以非主键索引无需做变更
节省存储空间:数据只用存一份就行了,不用建一个索引存储一份数据
联合索引的底层存储结构
按照第一列排序如果第一列重复则按照第二列排序,如果第二列重复则按照第三列排序,
推荐使用,ab,abc 这种索引 因为a,c 或者 b,c依然会触发全表扫描