聊聊聚集索引和辅助索引
前言
索引是数据库中非常重要的概念,它是存储引擎能够快速定位记录的秘密武器,对于提升数据库的性能、减轻数据库服务器的负担有着非常重要的作用;索引优化是对查询性能优化的最有效手段,它能够轻松地将查询的性能提高几个数量级。
索引的数据结构
InnoDB 存储引擎在绝大多数情况下使用 B+ 树建立索引,这是关系型数据库中查找最为常用和有效的索引,但是 B+ 树索引并不能找到一个给定键对应的具体值,它只能找到数据行对应的页,然后把整个页读入到内存中,并在内存中查找具体的数据行。
B+ 树是平衡树,它查找任意节点所耗费的时间都是完全相同的,比较的次数就是 B+ 树的高度;在这里,我们并不会深入分析或者动手实现一个 B+ 树,只是对它的特性进行简单的介绍。
聚集索引
InnoDB 存储引擎中的表都是使用索引组织的,也就是按照键的顺序存放;聚集索引就是按照表中主键的顺序构建一颗 B+ 树,并在叶节点中存放表中的行记录数据。
CREATE TABLE users(
id INT NOT NULL,
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(20) NOT NULL,
age INT NOT NULL,
PRIMARY KEY(id),
KEY(last_name, first_name, age)
KEY(first_name)
);
如果使用上面的 SQL 在数据库中创建一张表,B+ 树就会使用 id
作为索引的键,并在叶子节点中存储一条记录中的所有信息。
上图中对 B+ 树的描述与真实情况下 B+ 树中的数据结构有一些差别,不过这里想要表达的主要意思是:聚集索引叶节点中保存的是整条行记录,而不是其中的一部分。
聚集索引与表的物理存储方式有着非常密切的关系,所有正常的表应该有且仅有一个聚集索引(绝大多数情况下都是主键),表中的所有行记录数据都是按照聚集索引的顺序存放的。当我们使用聚集索引对表中的数据进行检索时,可以直接获得聚集索引所对应的整条行记录数据所在的页,不需要进行第二次操作。
辅助索引
数据库将所有的非聚集索引都划分为辅助索引,辅助索引也是通过 B+ 树实现的,但是它的叶节点并不包含行记录的全部数据,仅包含索引中的所有键和一个用于查找对应行记录的『书签』,在 InnoDB 中这个书签就是当前记录的主键。辅助索引的存在并不会影响聚集索引,因为聚集索引构成的 B+ 树是数据实际存储的形式,而辅助索引只用于加速数据的查找,所以一张表上往往有多个辅助索引以此来提升数据库的性能。
如果在表 users
中存在一个辅助索引 (first_name, age)
,那么它构成的 B+ 树大致就是上图这样,按照 (first_name, age)
的字母顺序对表中的数据进行排序,当查找到主键时,再通过聚集索引获取到整条行记录。
上图展示了一个使用辅助索引查找一条表记录的过程:通过辅助索引查找到对应的主键,最后在聚集索引中使用主键获取对应的行记录,这也是通常情况下行记录的查找方式。
上一篇: 为什么mysql的索引是最最左前缀?
下一篇: createjs打飞机
推荐阅读
-
SQL Server聚集索引和非聚焦索引
-
聊聊聚集索引和辅助索引
-
【MySQL】MySQL的存储引擎和索引详解(聚集索引和非聚集索引)
-
【MySQL】索引优化中的最左前缀原则和索引下推
-
MySQL创建前缀索引和索引选择性
-
数据结构二分法-给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。
-
索引多维数组_PHP数组–索引,关联和多维
-
记录一个sql优化后大大提高查询效率的情形 博客分类: 数据库 sql优化索引concat和substr拆分
-
【转】MySql索引类型的总结和使用 博客分类: 数据库 mysql索引
-
03 tensorflow 索引和切片