0%

MySQL学习总结(3)

索引

索引常见模型

  • 哈希表
  • 适用于只有等值查询的场景
  • 有序数组
  • 适用于等值查询,范围查询
  • 更新成本高,适用于静态存储引擎
  • 搜索树
  • 查询复杂度O(log(N))
  • 更新操作复杂度O(log(N))
  • 为了适配磁盘,往往使用N叉树

InnoDB索引模型

  • 表都是根据主键顺序以索引形式存放。

  • 使用了B+树索引模型,数据存储在B+树中。

  • 根据叶子节点内容,索引类型分主键索引和非主键索引

  • 主键索引叶子节点存放的是整行的数据,也成为聚簇索引。

  • 非主键索引叶子节点存放的是主键的值,非主键索引也成为二级索引

  • 区别:基于非主键索引的查询需要多扫描一颗索引树。

索引维护

  • 一个数据页满了,按照B+Tree算法,会新增加一个数据页,这个过程称为页分裂,会导致性能下降,空间利用率降低大概一半。
  • 两个相邻的数据页利用率如果都很低,会做数据合并,也就是页分裂逆过程
  • B+树的插入可能会引起数据页的分裂,删除可能会引起数据页的合并,二者都是比较重的IO消耗,所以比较好的方式是顺序插入数据,这也是我们一般使用自增主键的原因之一
  • 在Key-Value的场景下,只有一个索引且是唯一索引,则适合直接使用业务字段作为主键索引
  • 非主键索引的叶子结点存储的是主键的值,所以主键字段占用空间不宜过大。同时,其查找数据的过程称为“回表”,需要先查找自己得到主键值,再在主键索引上边查找数据内容。
  • 索引的实现由存储引擎来决定,InnoDB使用B+树(N叉树,比如1200叉树),把整颗树的高度维持在很小的范围内,同时在内存里缓存前面若干层的节点,可以极大地降低访问磁盘的次数,提高读的效率。

覆盖索引

  • 回到主键索引树搜索的过程,我们称为回表
  • 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

最左前缀原则

  • B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
  • 在建立联合索引的时候,如何安排索引内的字段顺序
  • 第一原则,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是最需要有限考虑的。
  • 再次考虑空间

索引下推

  • MySQL 5.6 引入的索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

小结

  • 满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。
  • 设计表结构时,也要以减少资源消耗作为目标。

  • 源:<极客时间> MySQL实战45讲教程