MySQL索引底层采用B+树结构,支持10亿级数据3次IO快速查询,相比哈希索引更适合范围查询。联合索引遵循最左匹配原则,覆盖索引可避免回表提升性能。警惕索引失效六大陷阱,如隐式类型转换、前导通配符等。优化索引遵循三星原则,利用索引下推减少回表。高频面试题解析自增主键优势及索引创建标准,通过慢查询日志和基数分析判断索引必要性。掌握这些MySQL索引核心原理与优化技巧,轻松应对数据库性能调优挑战,提升系统查询效率。
2025年Java面试宝典下载地址(提取码:9b3g)
MySQL索引最常用的B+树结构,由三层组成:根节点、中间节点和叶子节点。叶子节点存储实际数据,并通过双向链表连接,支持快速范围查询。B+树的高度通常控制在3-4层,意味着查询10亿级数据只需3次磁盘IO。
与哈希索引相比,B+树支持范围查询和排序操作。哈希索引虽然O(1)时间复杂度查询,但无法处理>、<等范围查询,这是B+树成为主流索引结构的关键原因。
主键索引叶子节点存储整行数据,而非主键索引(二级索引)叶子节点存储主键值。这解释了为什么建议使用覆盖索引:当查询字段都在索引中时,可以直接从索引树获取数据,避免回表操作。
建立(name,age)的联合索引时:
where name='张三'
、where name='李四' and age>20
where age=25
、where name like '%张%'
对于长文本字段(如地址),可使用alter table user add index idx_addr(address(10))
创建前缀索引。需注意区分度评估,通过select count(distinct left(address,10))/count(*)
计算选择性。
where phone=13800138000
(phone是varchar类型)where date_format(create_time,'%Y-%m')='2024-01'
where name like '%张三%'
where age=20 or address='北京'
(address无索引)where age>18
where id+1=100
MySQL5.6引入的特性,在存储引擎层过滤数据。例如联合索引(name,age)查询:
select * from user
where name like '张%' and age>20
存储引擎会先按name筛选,再过滤age>20的记录,减少回表次数。
通过explain
查看执行计划时重点关注:
面试官问:为什么建议用自增主键? 答:自增主键保证插入数据时,新记录总是追加到B+树末尾,避免页分裂。如果是随机主键(如UUID),可能造成频繁的页分裂和空间碎片。
面试官问:如何判断是否需要加索引?
答:通过慢查询日志定位高频慢SQL,使用show index from table
查看基数(cardinality)。当基数/总行数 > 10%时,该字段适合建索引。
需要购买《面试鸭》会员的同学,通过面试鸭返利网找我可返利25元。本文涉及的更多索引优化技巧,可在开头的网盘链接下载完整面试宝典。
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!