MySQL索引(1)-索引如何组织数据

186 阅读2分钟

1. mysql索引分类

mysql索引主要分为两类:

  • 主键索引

    每一张表的主键就是一个索引。mysql中组织数据也是通过该字段。在没有手动指定主键的情况下,mysql会自动生成一列 row_id 来作为主键。

  • 辅助索引

    常用的唯一索引,组合索引,普通的索引都是辅助索引。

主键索引和唯一索引的区别:

  • 唯一索引可以为空值,主键索引不能
  • mysql一张表只能有一个主键索引,而可以拥有多个唯一索引
  • 主键索引一定是一个唯一索引,而唯一索引不一定是主键索引

2. 主键索引的组织数据方式

mysql的数据逻辑组织方式如下图:

图片来自网上

下面看下主键组织数据的情况,也就是主键索引:

mysql主键组织数据.png

B+数组织的是mysql中的页数据。在B+树中的非叶子节点,存储的是主键和页号的指针。对于叶子节点存入的row数据。

在B+tree上有两头指针,一个指向根节点,另个知晓关键字的最小的叶子节点,而且所有的叶子及诶单之间是一种链式环结构。因此B+tree可以做两种查找运算:

  • 对主键范围查找和分页查找
  • 根节点开始的随机查找

这里通过会有一个计算层数能够存储的数据估算,例如:主键为int(4byte),页号指针6byte那么对于非叶子节点能够存储的数据量为,16K / (4+6) 能够存储1600条索引数据那么对于上面来说Degree=3的B+tree。假设一条记录的所占的空间为1K那么mysql一页数据可以存储16条数据。公式如下:

1600 X 1600 X 16 = 40960000 。

InnoDB是通过B+tree结构对主键创建索引,然后叶子节点存储记录。如果没有主键,那么会选择唯一建。如果没有唯一健就会生成一个六个字节的row_id来作为主键。

3. 辅助索引组织数据的方式

数据的组织方式如下图:

mysql辅助索引组织数据方式.png

辅助索引非叶子节点的数据为:辅助索引值+页号的指针数据,叶子节点为辅助索引的数据和主键的索引。

4. 总结

  • 主键索引叶子节点跟的是数据,而负责索引叶子节点跟的主键。
  • 如果查询包含所有的辅助索引并且能够符合索引的匹配原则,那么这种情况下就不需要进行回表查询数据,这也叫覆盖索引

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢!