1. mysql索引分类
mysql索引主要分为两类:
-
主键索引
每一张表的主键就是一个索引。mysql中组织数据也是通过该字段。在没有手动指定主键的情况下,mysql会自动生成一列 row_id 来作为主键。
-
辅助索引
常用的唯一索引,组合索引,普通的索引都是辅助索引。
主键索引和唯一索引的区别:
- 唯一索引可以为空值,主键索引不能
- mysql一张表只能有一个主键索引,而可以拥有多个唯一索引
- 主键索引一定是一个唯一索引,而唯一索引不一定是主键索引
2. 主键索引的组织数据方式
mysql的数据逻辑组织方式如下图:
下面看下主键组织数据的情况,也就是主键索引:
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. 辅助索引组织数据的方式
数据的组织方式如下图:
辅助索引非叶子节点的数据为:辅助索引值+页号的指针数据,叶子节点为辅助索引的数据和主键的索引。
4. 总结
- 主键索引叶子节点跟的是数据,而负责索引叶子节点跟的主键。
- 如果查询包含所有的辅助索引并且能够符合索引的匹配原则,那么这种情况下就不需要进行回表查询数据,这也叫覆盖索引
我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢!