抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

mysql索引

索引是什么

索引是帮助Mysql高效获取数据的排好序的数据结构。

索引可以用的数据结构有:

  • 二叉树
  • 红黑树
  • Hash表
  • B-Tree

BTree

  • 叶子节点具有相同的深度,叶节点的指针为空

  • 所有索引元素不重复

  • 节点中的数据索引从左往右递增排列

    B+树(B树变种)

  • 非叶子节点不存储data,只存储索引(索引会冗余),因此每页可以存储更多索引

  • 叶子节点包含所有索引字段

  • 叶子节点用指针连接,提高区间访问能力

聚集索引

索引文件和数据文件在一起的是聚集索引。

非聚集索引

索引文件和数据文件分离的是非聚集索引

InnoDB索引实现

InnoDb索引是聚集索引。表数据本身就是按照B+树结构存储的一个索引结构文件。因此InnDB存储的表必须存在主键。
辅助索引使用的非聚集索引。存储的是主键值。聚集索引的叶子节点包含了完整的数据记录。

为何InonoDB非主键索引结构叶子节点存储的是主键值

非主键索引叶子节点存储主键而不是存储数据是从两方面考虑。一是如果存储数据数据的更新删除添加操作会存在数据不一致问题。
维护数据一致性会很复杂。二是会浪费大量空间。

为什么InnoDb表必须有主键且推荐使用整型的自增主键

表数据本身就是按照B+树结构存储的,因此必须有主键,

联合索引

联合索引的存储结构也是采用b+树,索引值是按照构建索引时键的顺序存储。
叶子节点存储的是主键值。

最左前缀原理

如果要使用联合索引必须要遵循最左前缀原理使用。比如key(a,b,c)
直接使用c是几乎不会走索引的。也就是说要使用联合索引的字段进行查询。
在联合索引中这个字段的左侧字段也必须使用。不然不会走索引(覆盖索引例外)。

覆盖索引

评论