mysql 索引学习小结

mysql 索引

学习了《MySQL 是怎样运行的:从根儿上理解 MySQL》中的索引一节,收获颇丰,总结如下。

innodb 索引(组织结构 b+ 树)

用户记录 -> 用户记录数据页-> 目录项记录 -> 目录项记录数据页 -> 更大范围目录项记录 -> 更大范围目录项记录数据页 -> 更大范围…

  1. 用户记录数据页 中包含针对 用户记录 的目录,称为 页目录,用来使用二分法快速查找 用户记录
  2. 目录项记录数据页 是针对 用户记录数据页 的目录,也包含一个 页目录,但用来使用二分法快速查找 目录项记录
  3. 一个 用户记录数据页 对应多个 用户记录
  4. 一个 用户记录数据页 对应一个 目录项记录
  5. 一个 目录项记录数据页 对应多个 目录项记录
  6. 一个 目录项记录数据页 对应一个 更大范围目录项记录

聚簇索引

以上述结构组织数据,且存储了所有 完整 用户记录的索引,一般是主键索引

二级索引

以上述结构组织数据,但数据不存储完整用户记录,仅存储索引列 + 主键列的值,一般是用户自己建立的索引。这里存储主键的原因是用来使用这个主键进行 回表,去聚簇索引中取出该索引列对应的完整用户记录,因为会查询两次索引,所以二级索引命名由此而来,除聚簇索引外都是二级索引,联合(多列)索引也属于二级索引的一种

MyISAM:

与 innodb 索引最大的区别在于组织结构,innodb 索引中最重要的聚簇索引意味着索引即数据,数据亦即索引;但 myisam 索引秉承着索引就是索引,数据就是数据,二者不能放到一起的宗旨,将索引和数据分开存储,用户记录被 无脑 塞到数据文件里去,索引文件中保存用户记录在数据文件中的行号(文件偏移量)和主键,查询时基于主键命中索引后,拿着行号去数据文件中直接取用户记录,这种访问文件的方法是随机存取,因此虽然 myisam 的所有索引都是二级索引,也不会有太大的性能问题