mysql索引
B+树
- 存储引擎与磁盘的交互是以page页的形式,page页的数据存储大小是16k
- B+树就是将page页的位置信息生成目录
- 目录记录的主要参数是 序号开始、页码
- 然后又对目录按同样的方式创建目录
注:
- 创建目录的层级越高,存储引擎与磁盘的交互次数就越多(查询时间就越长)
- 对于大数据字段,由于数据会保存在多个page页中,会导致目录的层级变高
- 若B+树根据的字段是无序的,则每次新增或修改会导致更多次的B+树的分裂和合并
索引分类
- 主键索引
表设置主键后,会根据主键生成B+树
- 聚集索引
- 表未设置主键后会自动创建聚集索引,会根据聚集索引生成B+树
- 以非空的唯一索引字段作为聚集索引,若非空的唯一索引也没有则会以rowid做为聚集索引
二级索引
联合索引
- 多个字段保证唯一创建B+树
- 联合索引的好处是不用进行回表
- 若查询的字段在联合索引之中,则只需要查询联合索引B+树的目录层级
- 若查询的字段不在联合索引之中,则从目录层级获取到联合索引存在的字段后,还要去查询主键索引或聚集索引
覆盖索引
- 叶子节点保存主键的值,当需要查询的值不在联合索引中的时候会直接去读取覆盖索引
- 使用覆盖索引会减少回表次数
注:
创建索引一定需要避免用 散列性不强 的字段作为索引,即若多个数据该字段都是同样的数据,在进行B+树寻找的时候,找到的范围会很大,索引的作用就不大了
面试题:
- 为什么一张表的数据达到500万后建议分库分表?
答:500万数据的表建立索引后,B+树的层级会变得很高,当进行查询的时候,数据引擎与磁盘的交互次数会变得很多,查询效率低
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SimpleMw's Blog!