Day67【概念解析】 MySQL Index
目录 ▼
整理定义
什么是索引
一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。
MySQL的索引
在MySQL中,索引是一种数据结构,它通过形成代表特定列或一组列的所有值的树结构(B树),为表的行提供快速查找能力。
InnoDB表总是有一个代表主键的聚簇索引。它们也可以有一个或多个定义在一个或多个列上的辅助索引。根据它们的结构,辅助索引可以被分类为部分索引、列索引或复合索引。
索引是查询性能的关键方面。数据库架构师设计表、查询和索引,以便快速查找应用程序所需的数据。理想的数据库设计在实际中使用覆盖索引;查询结果完全由索引计算得出,无需读取实际的表数据。每个外键约束也需要一个索引,以高效地检查父表和子表中是否存在值。
复述展开
在MySQL中,有以下几种索引:
B-Tree 与 B+Tree
B-Tree(平衡树)和B+Tree是两种常用的索引和数据结构,它们在数据库系统中广泛应用于数据的组织、管理和索引。
B-Tree

B-Tree是一种自平衡的树数据结构,它维持数据的排序,允许搜索、顺序访问、插入和删除在对数时间内完成。B-Tree的特点包括:
-
每个节点有多个孩子,节点中的键值按顺序排列。
-
树的所有叶子节点都在同一层。
-
节点中的键值数目有一个上限和下限(除了根节点和叶子节点)。
-
B-Tree通过分裂和合并节点来维持平衡。
B+Tree

B+Tree是B-Tree的一个变种,它具有B-Tree的所有特性,但在其结构上有所不同:
-
所有的数据记录都存储在叶子节点上,叶子节点形成了一个链表,便于进行全范围扫描。
-
非叶子节点(内部节点)仅存储键值信息,不存储数据记录,这意味着相比于B-Tree,B+Tree可以有更高的分支因子,使得树更加矮胖,减少了磁盘I/O次数。
-
叶子节点之间通过指针连接,这提供了顺序访问数据的能力。
B-Tree与B+Tree的区别
-
数据存储:B-Tree的数据存储在每个节点上,而B+Tree的数据仅存储在叶子节点上。
-
树的高度:B+Tree通常更矮胖,因为内部节点不存储数据,可以有更多的子节点。
-
范围查询:B+Tree由于叶子节点的链表结构,使得范围查询更加高效。
-
磁盘读写:B+Tree的查询性能更加稳定,因为所有查询都要查找到叶子节点,而B-Tree的查询可能在非叶子节点就结束了。
为什么MySQL选择使用B+Tree
MySQL选择使用B+Tree作为索引结构,主要是因为B+Tree在数据库索引中的几个优势:
-
高效的范围查询:由于叶子节点的链表结构,B+Tree特别适合处理范围查询,这在数据库操作中非常常见。
-
更少的磁盘I/O:B+Tree的内部节点不存储数据,可以拥有更多的分支,这减少了树的高度,从而减少了磁盘I/O次数,提高了查询效率。
-
查询性能稳定:B+Tree的所有查询都要走到叶子节点,这使得每次查询的磁盘读取次数相对固定,性能更加稳定。
理解体会
理解MySQL,必须要学习好MySQL中的索引,知道索引的数据结构,才能更好的对其进行优化与调整。
参考
-
MySQL索引概述: https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
-
B-Tree索引: https://dev.mysql.com/doc/refman/8.0/en/btree-indexes.html
-
Hash索引: https://dev.mysql.com/doc/refman/8.0/en/hash-indexes.html
-
Fulltext索引: https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html
-
R-Tree索引: https://dev.mysql.com/doc/refman/8.0/en/rtree-indexes.html
-
Spatial索引: https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html