mysql索引
索引是什么
索引是帮助Mysql高效获取数据的排好序的数据结构。
索引可以用的数据结构有:
- 二叉树
- 红黑树
- Hash表
- B-Tree
BTree
叶子节点具有相同的深度,叶节点的指针为空
所有索引元素不重复
节点中的数据索引从左往右递增排列
B+树(B树变种)
非叶子节点不存储data,只存储索引(索引会冗余),因此每页可以存储更多索引
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间访问能力
聚集索引
索引文件和数据文件在一起的是聚集索引。
非聚集索引
索引文件和数据文件分离的是非聚集索引
InnoDB索引实现
InnoDb索引是聚集索引。表数据本身就是按照B+树结构存储的一个索引结构文件。因此InnDB存储的表必须存在主键。
辅助索引使用的非聚集索引。存储的是主键值。聚集索引的叶子节点包含了完整的数据记录。
为何InonoDB非主键索引结构叶子节点存储的是主键值
非主键索引叶子节点存储主键而不是存储数据是从两方面考虑。一是如果存储数据数据的更新删除添加操作会存在数据不一致问题。
维护数据一致性会很复杂。二是会浪费大量空间。
为什么InnoDb表必须有主键且推荐使用整型的自增主键
表数据本身就是按照B+树结构存储的,因此必须有主键,
联合索引
联合索引的存储结构也是采用b+树,索引值是按照构建索引时键的顺序存储。
叶子节点存储的是主键值。
最左前缀原理
如果要使用联合索引必须要遵循最左前缀原理使用。比如key(a,b,c)
直接使用c是几乎不会走索引的。也就是说要使用联合索引的字段进行查询。
在联合索引中这个字段的左侧字段也必须使用。不然不会走索引(覆盖索引例外)。