【MySQL】索引原理详解
MySQL 索引原理详解从基础到实战索引是查询优化中最核心的工具。理解索引原理不仅能让你写出高性能 SQL还能在面试中脱颖而出。本文将分为以下几个部分索引基础概念索引类型及底层实现BTree 与查询原理聚簇索引 vs 非聚簇索引联合索引与最左前缀索引优化实战易错点和面试高频考点一、索引基础概念索引Index可以理解为数据库为加快查询而建立的一种数据结构。类比生活中的书籍目录你不可能从第一页翻到最后一页找某个章节但通过目录你可以直接跳到目标页。索引作用提高查询速度WHERE、JOIN、ORDER BY、GROUP BY降低全表扫描次数支持唯一性约束UNIQUE代价占用额外存储空间插入、更新、删除操作会增加维护成本实例假设有一张用户表CREATETABLEuser(idINTPRIMARYKEY,nameVARCHAR(50),ageINT,emailVARCHAR(100));如果你经常按name查找用户SELECT*FROMuserWHEREnameTom;没有索引MySQL 会全表扫描扫描 N 行数据如果创建索引CREATEINDEXidx_nameONuser(name);查询就能快速定位Tom的位置减少扫描行数。二、索引类型与底层实现1. 主键索引Primary Key Index每张表只能有一个主键主键列自动创建聚簇索引InnoDB 默认保证唯一性2. 唯一索引Unique Index可以有多个保证索引列值唯一3. 普通索引Index最常用索引类型不保证唯一性4. 全文索引FULLTEXT适用于大文本检索如文章内容搜索常配合MATCH ... AGAINST使用5. 复合索引联合索引 Composite Index多列组合成一个索引支持最左前缀原则三、BTree 与查询原理MySQLInnoDB索引底层实现大多是BTree它比B-Tree更适合数据库存储。BTree 特点所有数据都在叶子节点非叶子节点只存索引键叶子节点通过链表连接方便范围查询树高较低 → 查询速度快查询示例SELECT*FROMuserWHEREid1001;BTree 查询过程从根节点开始比较 id决定进入左子树或右子树递归查找到叶子节点找到目标记录返回数据特点单条记录查询 O(logN)范围查询高效叶子节点链表支持 ORDER BY、GROUP BY 索引优化四、聚簇索引 vs 非聚簇索引特性聚簇索引Clustered非聚簇索引Secondary/普通索引数据存储位置叶子节点存储行数据叶子节点只存索引 主键回表查数据主键默认是主键可以在非主键列上建立查询效率高无需回表查询时可能需要回表示例InnoDB PK普通索引回表示例CREATEINDEXidx_nameONuser(name);SELECTemailFROMuserWHEREnameTom;idx_name 是二级索引查到叶子节点的主键 id再去聚簇索引查 email → 这就是回表五、联合索引与最左前缀原则联合索引示例CREATEINDEXidx_age_cityONuser(age,city);最左前缀原则查询条件必须使用索引最左列才能走索引查询能否使用索引WHERE age20✅WHERE age20 AND city‘Beijing’✅WHERE city‘Beijing’❌示例优化错误SELECT*FROMuserWHEREcityBeijing;优化SELECT*FROMuserWHEREage20ANDcityBeijing;六、索引优化实战1. 避免全表扫描没有索引SELECT*FROMorderWHEREcreate_time2026-01-01;添加索引CREATEINDEXidx_create_timeONorder(create_time);2. 使用覆盖索引CREATEINDEXidx_name_ageONuser(name,age);SELECTname,ageFROMuserWHEREnameTom;查询字段全在索引中 →无需回表IO开销更小3. 避免索引失效函数操作WHERE YEAR(create_time)2026→ 索引失效隐式类型转换WHERE id1001id是INTLIKELIKE %abc→ 索引失效七、索引易错点 面试高频点索引越多越好❌ 会降低写入效率占用空间BTree 为什么比 B-Tree 更适合数据库叶子节点链表 → 范围查询快树高低 → IO少联合索引最左前缀原则面试必问点聚簇索引和二级索引的区别回表查询原理什么时候索引会失效函数、类型转换、模糊查询、OR条件等八、总结索引优化的核心是理解BTree原理→ 知道索引怎么查合理设计索引→ 单列、联合索引、覆盖索引避免索引失效→ 不做函数操作、不做隐式类型转换用EXPLAIN验证效果→ 确保查询计划优化索引是数据库的核心利器掌握索引原理写SQL就像开挂一样快。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409106.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!