首页 >文档 > mysql索引

mysql索引

MySQL索引底层采用B+树结构,支持10亿级数据3次IO快速查询,相比哈希索引更适合范围查询。联合索引遵循最左匹配原则,覆盖索引可避免回表提升性能。警惕索引失效六大陷阱,如隐式类型转换、前导通配符等。优化索引遵循三星原则,利用索引下推减少回表。高频面试题解析自增主键优势及索引创建标准,通过慢查询日志和基数分析判断索引必要性。掌握这些MySQL索引核心原理与优化技巧,轻松应对数据库性能调优挑战,提升系统查询效率。

2025年Java面试宝典下载地址(提取码:9b3g)

一、MySQL索引的底层原理

MySQL索引最常用的B+树结构,由三层组成:根节点、中间节点和叶子节点。叶子节点存储实际数据,并通过双向链表连接,支持快速范围查询。B+树的高度通常控制在3-4层,意味着查询10亿级数据只需3次磁盘IO。

面试鸭返利网

与哈希索引相比,B+树支持范围查询和排序操作。哈希索引虽然O(1)时间复杂度查询,但无法处理>、<等范围查询,这是B+树成为主流索引结构的关键原因。

二、索引类型与选择策略

1. 主键索引与非主键索引

主键索引叶子节点存储整行数据,而非主键索引(二级索引)叶子节点存储主键值。这解释了为什么建议使用覆盖索引:当查询字段都在索引中时,可以直接从索引树获取数据,避免回表操作。

2. 组合索引最左匹配原则

建立(name,age)的联合索引时:

  • 能生效的查询:where name='张三'where name='李四' and age>20
  • 不生效的查询:where age=25where name like '%张%'

面试鸭返利网

3. 前缀索引使用场景

对于长文本字段(如地址),可使用alter table user add index idx_addr(address(10))创建前缀索引。需注意区分度评估,通过select count(distinct left(address,10))/count(*)计算选择性。

三、索引失效的六大陷阱

  1. 隐式类型转换where phone=13800138000(phone是varchar类型)
  2. 函数操作where date_format(create_time,'%Y-%m')='2024-01'
  3. 前导通配符where name like '%张三%'
  4. OR连接非索引字段where age=20 or address='北京'(address无索引)
  5. 不符合最左前缀:联合索引(name,age)下使用where age>18
  6. 索引列参与运算where id+1=100

四、索引优化核心方法论

1. 三星索引原则

  • 一星:where条件匹配索引列
  • 二星:order by排序使用索引
  • 三星:select字段被索引覆盖

2. 索引下推(ICP)

MySQL5.6引入的特性,在存储引擎层过滤数据。例如联合索引(name,age)查询:

select * from user 
where name like '张%' and age>20

存储引擎会先按name筛选,再过滤age>20的记录,减少回表次数。

面试鸭返利网

3. 索引监控手段

通过explain查看执行计划时重点关注:

  • type列:至少达到range级别
  • key_len:实际使用的索引长度
  • Extra列:是否出现Using filesort、Using temporary

五、高频面试题精讲

面试官问:为什么建议用自增主键? 答:自增主键保证插入数据时,新记录总是追加到B+树末尾,避免页分裂。如果是随机主键(如UUID),可能造成频繁的页分裂和空间碎片。

面试官问:如何判断是否需要加索引? 答:通过慢查询日志定位高频慢SQL,使用show index from table查看基数(cardinality)。当基数/总行数 > 10%时,该字段适合建索引。

需要购买《面试鸭》会员的同学,通过面试鸭返利网找我可返利25元。本文涉及的更多索引优化技巧,可在开头的网盘链接下载完整面试宝典。

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →