mysql-索引学习小结
mysql 索引
学习了《MySQL 是怎样运行的:从根儿上理解 MySQL》中的索引一节,收获颇丰,总结如下。
innodb 索引(组织结构 b+ 树)
用户记录 -> 用户记录数据页-> 目录项记录 -> 目录项记录数据页 -> 更大范围目录项记录 -> 更大范围目录项记录数据页 -> 更大范围...
用户记录数据页
中包含针对用户记录
的目录,称为页目录
,用来使用二分法快速查找用户记录
目录项记录数据页
是针对用户记录数据页
的目录,也包含一个页目录
,但用来使用二分法快速查找目录项记录
- 一个
用户记录数据页
对应多个用户记录
- 一个
用户记录数据页
对应一个目录项记录
- 一个
目录项记录数据页
对应多个目录项记录
- 一个
目录项记录数据页
对应一个更大范围目录项记录
- ...
聚簇索引
以上述结构组织数据,且存储了所有 完整
用户记录的索引,一般是主键索引
二级索引
以上述结构组织数据,但数据不存储完整用户记录,仅存储索引列 + 主键列的值,一般是用户自己建立的索引。这里存储主键的原因是用来使用这个主键进行 回表
,去聚簇索引中取出该索引列对应的完整用户记录,因为会查询两次索引,所以二级索引命名由此而来,除聚簇索引外都是二级索引,联合(多列)索引也属于二级索引的一种
MyISAM:
与 innodb 索引最大的区别在于组织结构,innodb 索引中最重要的聚簇索引意味着索引即数据,数据亦即索引;但 myisam 索引秉承着索引就是索引,数据就是数据,二者不能放到一起的宗旨,将索引和数据分开存储,用户记录被 无脑
塞到数据文件里去,索引文件中保存用户记录在数据文件中的行号(文件偏移量)和主键,查询时基于主键命中索引后,拿着行号去数据文件中直接取用户记录,这种访问文件的方法是随机存取,因此虽然 myisam 的所有索引都是二级索引,也不会有太大的性能问题