01.23 Day 4 - MySQL 的索引

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 4 天,也是我第 43 次进行这种操作。

今天我温习了该专栏里叫《深入浅出索引(上)》、《深入浅出索引(下)》的文章。

关键词总结:索引常见模型(哈希表、有序数组、搜索树)、InnoDB 索引模型(主键索引/聚簇索引、非主键索引/二级索引、主键索引与普通索引的查询区别)、索引维护(占用空间)、覆盖索引(提升查询性能)、最左前缀原则(建立联合以及单字段索引)、索引下推。

所学总结:

索引常见模型

索引可以提高查询效率。

哈希表

键值数据结构,根据 key 找 value。通过哈希函数将 key 换算成一个下标,然后将 value 放在数组中该下标所处的位置。
哈希表只适用于等值查询的场景,例如 Memcached 或其他 NoSQL 存储。

有序数组

在等值或范围查询中都能有比价好的性能表现。
有序数组只适合静态存储,例如一些不会做改动的数据。

搜索树

二叉树的搜索效率最高,但实际上大多数数据库存储却不适用。因为索引不止存在于内存,还要同时写到磁盘。
为了尽量减少 IO 操作,要让查询尽量少访问或不访问数据块,所以我们就不使用二叉树。

InnoDB 索引模型

使用了 B+ 树索引模型,所以数据存储在 B+ 树中。
每个索引对应一棵 B+ 树。

主键索引/聚簇索引 / Clustered Index

叶子结点所存的是一整行数据。

非主键索引/二级索引 / Secondary Index

叶子结点所存的是逐渐的值。

主键索引与普通索引的查询区别

  • 主键索引:只需要搜索主键字段所对应的 B+ 树;
  • 普通索引:需要先搜索普通字段的索引树,得到其主键值,再借助主键值到主键字段所对应的索引树中再查询一次。这个过程叫回表。
  • 非主键索引的查询需要多扫描一棵索引树,因此,应尽量使用主键查询。
     

索引维护

占用空间

主键长度越小,普通索引的叶子结点就越小,普通索引占用的空间也就越小。
以性能以及空间利用率为出发点的话,自增主键是比较合理的选择。
 

覆盖索引

提升查询性能

覆盖索引可以减少树的搜索次数,能很明显的提高查询性能,所以使用覆盖索引是常见的优化方式。
 

最左前缀原则

可以利用 B+ 树索引结构的 “最左前缀” 来定位记录。

建立联合以及单字段索引

第一原则是当通过调整顺序后,如果能少维护一个索引,那该顺序则很有可能被优先采用。
 

索引下推

在索引遍历过程中对其所包含的字段先做判断,过滤不匹配的记录以减少回表次数。

末了

重新总结了一下文中提到的内容:数据库索引概念、覆盖索引、前缀索引、索引下推、减少资源访问和消耗。

发布了79 篇原创文章 · 获赞 6 · 访问量 1824

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104074064