MySql学习笔记-02索引
索引
1、覆盖索引的使用
作用: 为了提供数据库的查询性能,使用覆盖索引
举例: 只需要通过特定搜索字段A查询特定字段B,可以通过构建A和B的联合索引,提高查询效率。如果只对查询字段建立了索引,那么需要先通过查询字段找到对应的主键ID,再通过主键ID获取对应整行的值
原因: 一张表,以主键为key,整行数据为value构建B+树。如果建立了额外字段A的索引,会以A为key,主键为value构建B+树。这样就导致了其他索引去查表中字段的时候,先是找到对应的主键,再去取主键对应的整行数据
2、为什么使用B+树
1、其他二叉树的树高会很高,会有较高的寻址代价。
2、为什么不使用B树呢?减少磁盘的IO次数。B树每层节点也会存value值,导致查询索引的时候增加了页切换的频次。而B+树所有value值都放在叶子节点中,存储索引值占用的页数少,能够很好的配合磁盘的读写特性,减少磁盘的访问次数。
3、数据库相关命令
- explain命令 查询数据库语句命中了索引
- 如果索引统计信息不正确,可以使用 analyze table命令
- 如果一个表非常大,而实际上并没有存储那么多内容,可以使用 alter table 命令重建表
4、order by执行规则
- 如果排序字段没有建立索引:
- 通过查询条件找到所有符合条件的主键ID
- 通过主键ID获取所有行数据
- 按照排序字段对所有行数据进行排序
- 生成结果集
- 注意 如果内存处理不了这么多数据,会存储成多个临时文件,然后分别对每个临时文件进行排序,最后再使用归并排序汇总这些文件的排序信息。
- 如果排序字段没有建立索引,并且一行数据太多:
- 通过查询条件找到所有符合条件的主键ID
- 通过主键ID获取所有行数据
- 所有行数据中取出排序字段和主键,并存入到buffer中
- 按照排序字段对buffer中数据进行排序
- 通过已经排序好的主键ID获取所有行数据
- 生成结果集
- 如果排序字段建立了索引:
- 通过查询条件和排序索引字段生成已经排序好的主键ID列表
- 通过已经排序好的主键ID获取所有行数据
- 生成结果集