一、索引的本质
没有索引的sql是没有灵魂的,查询速度是非常慢的。
本质:索引是帮助MySql快速获取数据的排好序的数据结构。
二、 索引数据结构:
二叉树 :层级太高,自增主键索引甚至退化成了链表
红黑树 :红黑树是平衡二叉树的一种,相对于二叉树好点,但是当数据大时,层级还是很高,查询速度慢。
Hash表
B-Tree :
1.叶节点具有相同的 深度,叶节点的指针为空
2.所有索引元素不重复
3.节点中的数据索引从左到右递增排序
B+-Tree :B-Tree变种
1.非叶子节点不存储data,只储存索引(冗余),可以放更多的索引
2.叶子节点包含所有索引字段
3.叶子节点用指针连接,提高区间访问的性能
三、存储引擎索引
下面根据两个存储引擎所有进行下分析:MyISAM存储引擎索引、InnoDB存储引擎索引
MyISAM存储引擎索引:
MyISAM索引文件和数据文件是分离的(非聚集)
InnoDB索引实现(聚集)
1.表数据文件本身就是按B+Tree组织的一个索引结构文件
2.聚集索引-叶节点包含了完整的数据记录
问题1:为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
如果不主动为InnoDB表建立主键,sql会去找该表中不具有重复数据的列作为唯一导航,如找不到不重复的列,sql则会自动创建一个隐士的列作为唯一导航。性能会降低。
整形比对大小时速度快,如果用字符串比较大小可能会从头部比较到尾部,占空间和性能也会很大
问题2:为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
InnoDB索引的工作原理是:根据非主键索引查询时,先根据非主键索引查询到子节点获取到该主键索引,再根据主键索引查询到目标数据。保证了索引的一致性、节省了存储空间。