MySQL索引的存储结构

2.3.2. 索引存储结构

索引存储结构有堆表索引组织表两种方式。

堆表和索引组织表有什么区别?

堆表:

数据和索引是分开存放的,索引是排序后的,但堆数据是无序的进行的都是随机访问,索引的叶子节点中存放的是数据在堆表中的地址,堆表的数据发生改变且位置也发生变更,所有索引中的地址也要更新,非常影响性能。

索引组织表:

索引组织表中数据是根据主键顺序存放在索引中的,即使数据发生了位置变更,主键索引会自动调整数据记录的位置,非主键索引也会根据主键的变化而自动更新。索引就是数据。如果主键是id,表中数据就是按照id顺序存储的。

二级索引:

主键索引外都叫二级索引,跟主键索引不同的是,二级索引的叶子节点不直接存放数据 ,存放的是索引键值和主键值。通过二级索引只能找到主键值,通过主键索引进行查询才能得到结果。这个操作也叫做**"回表**"。

二级索引的好处就是,如果当前字段的值发生改变了,只修改当前字段的二级索引,其他的二级索引不需要更新,除非是对应的主键值也被更新了。

函数索引:

正常情况下索引都是建立在字段上,MySQL5.7之后,开始支持索引函数(索引键是一个函数表达式),主要作用是优化业务和配合虚拟字段。有时通过函数索引可以快速解决线上SQL的性能问题;

堆表和索引组织表的应用场景:

堆表比较适合查询操作比较少,写入操作比较多的业务,因为数据直接插入到数据文件中的末尾,不需要考虑索引结构,所以写入操作可以更快地完成。

索引组织表适合应用程序主要进行大量的查询操作时,索引组织表可以通过减少I/O访问提高查询性能。读取性能方面,索引组织表通常更有优势,因为可以通过索引直接访问数据,而不需要回表。

2.3.3. 组合索引

由多个字段组成的索引,既可以是主键索引也可以是二级索引。组合索引是按照索引字段的顺序排序的,查询中的排序条件与索引字段的顺序不一致时,数据库可能无法充分利用索引的有序性。

如何在业务中正确的设计组和索引?

  1. 避免额外排序:

例如,电商业务中,订单详情页需要根据用户id查询出订单数据,然后根据购买时间逆序展示,如果只根据用户id字段的索引查询,取出来数据之后还需要再根据购买时间排序。

可以创建用户id和购买时间的组和索引,首先根据用户id进行检索,然后在这个用户id的范围内,根据购买时间的逆序来检索数据,这样在取出结果时就已经是排好序的,不需要在额外排序。

  1. 避免回表:

如果要查询的字段不在索引中,就需要回表获取缺失的数据。

数据库执行查询操作时,先会根据查询条件使用的索引来定位到符合条件的记录的位置。如果索引包含了查询需要的所有字段,数据库可以直接从索引中获取数据,无需回表。这种情况称为索引覆盖(Index Covering)。

所以要利用好组合索引包含多个字段的特性(索引覆盖),提升 SQL 的查询性能,用好索引覆盖技术,性能提升 10 倍不是难事。

相关推荐
午彦琳1 小时前
2026.9.17
数据结构·算法·leetcode
linmengmeng_13141 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
笃行3502 小时前
别拿MySQL数据库管理工具硬导:MySQL 迁 KingbaseES 的完整工具链
数据库
风哥2号2 小时前
数据库教程FGMT51‑PostgreSQL实例管理与参数文件
数据库·postgresql
蓝速科技3 小时前
桌面双屏翻译机量产调试:三类场景兼容性破局方案丨蓝速科技
运维·数据库·人工智能·科技·技术分享
达梦数据3 小时前
DMDRS空间数据类型说明:Oracle、DM8、MySQL空间数据类型映射
数据库·mysql·oracle
白远山3 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
达梦数据3 小时前
DMDRS服务与模块的运行步骤
数据库
lusklusklusk4 小时前
Oracle索引组织表,SQLServer聚集索引,Mysql Innodb表的数据行不是在磁盘上像排队一样严格连续地存放
mysql·postgresql·oracle·sqlserver
让学习成为一种生活方式4 小时前
PMGD:植物线粒体基因组数据库--Journal of Integrative Plant Biology
数据库