MySQL索引优化面试题及答案(实战版).docxVIP

MySQL索引优化面试题及答案(实战版).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

MySQL索引优化面试题及答案(实战版)

一、基础理解题(考察核心概念落地)

问题:什么是索引?为什么说索引不是越多越好?实际工作中你会怎么控制索引数量?

答案:索引本质是数据表的“目录”,通过B+树(InnoDB默认)或哈希结构快速定位数据,减少全表扫描。但索引不是越多越好:一是索引会占用磁盘空间(比如一张千万级表的联合索引可能占几G);二是写操作(insert/update/delete)时,要同步维护所有相关索引,导致写性能下降。实际工作中,我会遵循“按需创建”:只给查询频繁的字段(where、join、orderby)建索引,单表索引数量控制在5-8个以内,定期通过慢查询日志清理无用索引。

问题:InnoDB的B+树索引和哈希索引有什么区别?什么时候用哈希索引更合适?

答案:核心区别在查询场景和排序支持:B+树索引是有序结构,支持范围查询(、、between)、排序(orderby)和模糊查询(likexxx%),适合大多数业务;哈希索引是键值对映射,只能支持等值查询(=、in),查询速度O(1),但不支持范围和排序。适合用哈希索引的场景:比如缓存表、字典表,查询都是精确匹配(比如根据用户ID查用户信息),且写操作少、读极频繁的场景。

二、设计实操题(考察索引设计逻辑)

问题:有一张订单表orders(id主键,user_id,order_no唯一,create_time,amount,status),常用查询场景:①根据user_id查近3个月的订单;②根据order_no查订单详情;③统计某status下amount大于1000的订单数。请设计索引,并说明理由。

答案:结合查询场景设计3个索引,避免冗余:

场景①:idx_user_create(user_id,create_time)——联合索引前缀匹配user_id,同时覆盖create_time的范围查询,无需回表;

场景②:uniqueindexidx_order_no(order_no)——order_no是唯一标识,建唯一索引既保证数据唯一性,又能快速等值查询;

场景③:idx_status_amount(status,amount)——先按status等值过滤,再对amount做范围查询(1000),符合联合索引“左前缀原则”,查询时直接通过索引统计,无需扫全表。

问题:联合索引的“左前缀原则”是什么?如果查询条件是“whereb=?andc=?”,而联合索引是(a,b,c),会走索引吗?为什么?

答案:左前缀原则是指联合索引(a,b,c)会优先匹配最左列a,再依次匹配b、c,只有查询条件包含最左列,或按左到右顺序匹配部分列时,才能用到索引(比如wherea=?、wherea=?andb=?会走索引,whereb=?不会)。如果查询条件是“whereb=?andc=?”,联合索引是(a,b,c),不会走索引——因为缺少最左列a的匹配,索引无法定位到有效范围,数据库会直接走全表扫描。解决办法:要么调整查询条件包含a,要么重建索引为(b,c)。

三、性能优化题(考察问题排查能力)

问题:明明给字段建了索引,查询却没走索引,可能是什么原因?你会怎么排查?

答案:常见原因有6种,排查时先执行explain看执行计划(重点看type、key、rows字段):

索引列用了函数/运算(比如wheredate(create_time)=2024-01-01、whereid+1=100),导致索引失效;

字符串字段和数值比较(比如wherephone而phone是varchar类型),触发隐式转换,索引失效;

模糊查询以%开头(比如wherenamelike%张三),B+树无法定位前缀,索引失效;

查询条件用了or(比如wherea=?orb=?,只有a或b其中一个有索引时,不会走索引);

数据倾斜严重(比如status字段90%都是“已完成”,查询wherestatus=已完成时,数据库认为全表扫描比走索引更快);

索引选择性太差(比如性别字段,只有男/女,建索引反而不如全表扫描)。

排查步骤:先看explain的key是否为目标索引→检查查询语句是否有上述“坑”→查看表数据分布(比如selectcount(distinctstatus)/count(*)看选择性)。

问题:如何优化分页查询(比如limit100000,20)的性能?为什么原查询慢?

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档