资讯详情

InnoDB存储引擎-索引与算法

📅 2026/10/12 3:06:25 | 华诺云谱 👁 阅读
InnoDB存储引擎-索引与算法
InnoDB存储引擎索引概述InnoDB存储引擎支持以下几种常见的索引:B树索引 (关系型数据库最常见的索引)全文索引自适应哈希索引B树B树 是为磁盘或其他直接存取辅助设备设计的一种平衡查找树. 在 B树中, 所有记录节点都是按键值的大小顺序存放在同一层叶子节点上.所有记录都存放在叶子节点, 并且是顺序存放的.B树索引B树索引 的本质就是B树在数据库中的实现. B树索引在数据库中有一个特点就是高扇出性, 因此在数据库中, B树的高度一般在 2-4 层.数据库中的 B树索引可以分为 聚集索引 和 辅助索引.每个数据页都通过一个双向链表来进行链接.聚集索引聚集索引就是按照每张表的主键构造一棵 B树, 同时叶子节点中存放的即为整张表中的行记录数据.聚集索引的这个特性决定了索引组织表中数据页是索引的一部分.由于实际的数据页只能按照一棵B树进行排序, 因此每张表只能有一个聚集索引.使用聚集索引的好处:①: 聚集索引能够在 B 树索引的叶子节点上直接找到数据.②: 由于定义了数据的逻辑顺序, 聚集索引能够很快地针对数据范围的访问.(范围查找和排序很快)特点:聚集索引的叶子节点存放的是完整的行记录; 非叶子节点存放的是索引,不是完整的行记录.聚集索引的存储并不是物理上连续的, 而是逻辑上连续的. 页通过双向链表链接, 页按照主键的顺序排序;每个页中的记录页是通过双向链表进行维护的.非聚集索引 (辅助索引)叶子节点并不包含完整的行记录.辅助索引的存在并不影响数据在聚集索引中的组织, 因此每张表上可以有多个辅助索引.查找过程:当通过辅助索引来查找数据时, InnoDB 存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录回表.Cardinality 值略B树索引的使用✅设计索引的时候有哪些原则考虑哪些因素联合索引联合索引是指对表上多个列进行索引. 从本质上来说 联合索引页是一棵 B树, 不同的是联合索引的键值的数量不是 1 , 而是大于等于 2.联合索引的好处:① 查询中有多个查询条件并且符合最左匹配原则, 那么查询都可以用到索引.② 索引本身已经对第一个键值后的键值进行了排序处理.覆盖索引从辅助索引中就能得到查询的记录, 而不需要查询聚集索引中的记录.SQL语句成本查询的 Extra 列的 Using index 就表明使用了覆盖索引.当我们进行数据统计的时候, 优化器会选择通过覆盖索引 而不会选择聚集索引, 因为覆盖所有的叶子节点没有存整个行记录, 因此大小要远小于聚集索引.索引下推索引下推Index Condition PushdownICP是MySQL 5.6引入的一种优化技术核心思想是让存储引擎在扫描索引时直接过滤掉不符合条件的记录减少回表次数从而提升查询性能。如果Extra列包含Using index condition说明启用了索引下推。工作原理假设有一个联合索引(a, b)执行以下查询SELECT*FROMtableWHEREa1ANDb10ANDcxxx;没有索引下推时存储引擎通过索引找到a 1的所有记录。回表获取完整数据行交给 MySQL 服务层。服务层再根据b 10和c xxx进一步过滤。启用索引下推后存储引擎通过索引找到a 1的记录后**直接在索引层过滤 **b 10即使c不在索引中。仅对满足a 1 AND b 10的记录回表。服务层再过滤c xxx。关键点将WHERE条件中索引列的筛选提前到存储引擎层处理减少无效回表。适用场景联合索引的部分列作为条件例如索引是(a, b)查询条件是a 1 AND b 10 AND c 5ICP 会直接过滤a和b。需要回表的查询如果查询的列不全在索引中例如需要SELECT *ICP 能显著减少回表的数据量。如何确认是否使用 ICP通过EXPLAIN查看执行计划如果Extra列包含Using index condition说明启用了索引下推EXPLAINSELECT*FROMtableWHEREa1ANDb10;示例对比表结构CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50),ageINT,cityVARCHAR(50),INDEXidx_age_city(age,city));查询SELECT*FROMusersWHEREage20ANDcityLIKEN%ANDnameJohn;无 ICP存储引擎通过索引idx_age_city找到age 20的所有记录。回表获取完整数据交给服务层。服务层过滤city LIKE N%和name John。有 ICP存储引擎通过索引idx_age_city找到age 20的记录后**直接过滤 **city LIKE N%。仅对满足age 20 AND city LIKE N%的记录回表。服务层再过滤name John。注意事项仅适用于二级索引如 InnoDB 的非主键索引。条件必须涉及索引列例如WHERE a 1 AND b 10其中(a, b)是联合索引。某些场景可能不生效使用函数或类型转换时如WHERE UPPER(a) X。总结索引下推通过将过滤条件“下推”到存储引擎层减少了回表的数据量尤其对联合索引和范围查询效果显著。结合执行计划 (EXPLAIN) 分析可以更好地利用这一优化。哈希算法略全文检索MySQL5.6 后开始支持全文索引.略.
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑