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 会根据表的访问模式自动将热点数据存储到哈希索引,这样就可以提高单表的查询速度。

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

相关推荐
倔强的石头_3 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横3 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二3 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐3 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
ClouGence4 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
云技纵横4 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神4 天前
三、用户与权限管理
数据库·mysql
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql