MySQL索引算法原理以及常见索引的使用

MySQL 索引原理

1、数据结构

B Tree指的是Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层,如下:

非聚集索引树:

INNODB存储引擎

主键字段索引树:

非聚集索引树:

1、B+ Tree索引

大多数MySQL存储引擎默认都是B+ Tree,因为不需要进行全表扫描,只需要对树进行搜索即可,所以查询的速度会快很多。InnoDB 的 B+Tree 索引分为主索引和辅助索引。主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。

2、哈希索引

哈希索引能以 O(1) 时间进行查找,但是失去了有序性:

  • 无法用于排序与分组;
  • 只支持精确查找,无法用于部分查找和范围查找。

InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。

2、多列索引

在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。

3、索引列的顺序

让选择性最强的索引列放在前面。索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高。这就是为什么一些枚举值的字段不建议建索引。

4、前缀索引

对于 BLOB、TEXT 和 VARCHAR 类型的列,合理使用前缀索引,只索引开始的部分字符。选择合适的前缀长度,既可以节省空间,也可以不用增加更多的查询成本。区分度越高性能越高,意味着重复的值就越少。

索引的优点

  • 大大减少了服务器需要扫描的数据行数。
  • 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表)。
  • 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起)。

参考B+ Tree演示地址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

索引设计(前缀索引):https://opensource.actionsky.com/20210120-mysql/

索引设计(MySQL的索引结构):https://opensource.actionsky.com/20201111-mysql/

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
MySQL索引算法原理以及常见索引的使用
B Tree指的是Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层,如下:
<<上一篇
下一篇>>