索引
索引常见模型
- 哈希表
- 适用于只有等值查询的场景
- 有序数组
- 适用于等值查询,范围查询
- 更新成本高,适用于静态存储引擎
- 搜索树
- 查询复杂度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讲教程