MySQL 的默认引擎 InnoDB 使用 B+ 树索引

MySQL 的默认引擎 InnoDB 使用 B+ 树索引。B+ 树是一种多路平衡查找树,它的每个节点最多包含 m 个子节点,m 被称为 B+ 树的阶。MySQL 的 B+ 树索引是在 B+ 树的基础上进行的优化,它的叶子节点存储了完整的数据记录,而不是像 B+ 树那样只存储键值。

主键索引/聚簇索引/聚集索引

InnoDB 的表数据文件本身就是索引文件,表数据文件本身就是按 B+ 树组织的一个索引结构,这棵树的叶子节点 data 域保存了完整的数据记录,这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这样的索引方式的优点是查找速度非常快,因为可以根据主键值直接找到数据记录所在的页。如果表中的数据按照主键顺序插入,那么数据在物理上也是顺序存放的,这种存储方式也提高了数据的访问速度。

主键索引也被称为聚簇索引,因为数据行和主键索引存储在一起,而且一个表只能有一个主键索引。当在创建表时没有显式指定主键,InnoDB 会生成一个隐藏的主键,这个主键包含一个自增的整数列,这个列就是这个隐藏的主键索引。

_rowid 是 InnoDB 的一个隐藏的列,它是一个 6 字节的整数,如果表中没有定义主键,InnoDB 会隐式定义一个主键索引,这个索引包含一个自增的整数列,这个列就是这个隐藏的主键索引。

非主键索引/二级索引/辅助索引

非主键索引的叶子节点不包含行的全部数据,而是包含主键的值。在 InnoDB 中,非主键索引的叶子节点 data 域存储的不是行的物理位置,而是主键的值。这样的索引叫做非聚簇索引,因为数据行的物理位置和主键索引分开了。非主键索引也被称为二级索引。

二级索引的叶子节点包含主键的值,而不是行的物理位置,所以在使用二级索引时,需要先根据二级索引找到主键值,然后再通过主键值找到完整的数据行。这个过程称为回表。过多的回表会降低查询效率,所以在使用二级索引时,应该尽量使用覆盖索引,即索引包含了查询所需要的全部数据,不需要回表。

联合索引/复合索引/组合索引

为了减少索引的数量,提高索引的效率,可以使用联合索引。联合索引是多个字段上创建的索引,只有在查询条件中使用了联合索引的第一个字段,索引才会被使用。使用联合索引时,要遵循最左前缀原则,即查询条件中使用了联合索引的第一个字段,索引才会被使用。

自适应哈希索引

自适应哈希索引是 InnoDB 引擎特有的一种索引,它是一种基于内存的索引,它的目的是提高单表的查询速度。自适应哈希索引是一种不稳定的索引,它是在内存中建立的,当表关闭时,自适应哈希索引就会丢失。自适应哈希索引的目的是提高单表的查询速度,它的原理是在 InnoDB 的缓冲池中维护一张哈希表,每当执行全表扫描时,InnoDB 会根据表的访问模式自动将热点数据存储到哈希表中,这样就可以提高单表的查询速度。

也就是说经常访问的数据会形成热点数据,InnoDB 会根据表的访问模式自动将热点数据存储到哈希索引,这样就可以提高单表的查询速度。

哈希索引的缺点是只能满足等值查询,不能使用范围查询,也不能用于排序和分组,因此哈希索引只能用于等值查询,不能用于范围查询。

相关推荐
叡鳍19 分钟前
hive---HQL查询
数据库
vortex51 小时前
谷歌黑客语法挖掘 SQL 注入漏洞
android·数据库·sql
九河云1 小时前
软件开发平台 DevCloud
运维·服务器·数据库·科技·华为云
wind_one12 小时前
7.基础--SQL--DDL-数据类型及案例
数据库·sql
l1t3 小时前
利用DeepSeek改写SQLite版本的二进制位数独求解SQL
数据库·人工智能·sql·sqlite
QT 小鲜肉3 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
研究司马懿3 小时前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
-指短琴长-4 小时前
MySQL快速入门——基本查询(下)
android·mysql·adb
刘一说4 小时前
深入理解 Spring Boot 中的数据库迁移:Flyway 与 Liquibase 实战指南
数据库·spring boot·oracle
August_._5 小时前
【MySQL】SQL语法详细总结
java·数据库·后端·sql·mysql·oracle