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

  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索引面试题及答案(实战版)

一、基础概念类

1.面试官:你能通俗讲讲MySQL索引到底是什么吗?实际工作中它解决了什么问题?

答案:索引本质是MySQL的“快速查找数据的目录”——就像新华字典的部首目录,不用逐页翻找,能直接定位目标位置。实际工作中,没有索引时查询会走“全表扫描”(比如几万条数据查一条,要遍历所有行),而索引能把查询时间从秒级压到毫秒级。比如电商项目查用户订单,user_id加索引后,能直接定位该用户的所有订单,不会扫描其他用户数据。

2.面试官:索引这么好用,为什么不给所有字段都建索引?

答案:因为索引是“双刃剑”,有维护成本:①写操作(insert/update/delete)变慢——修改数据时,不仅要改表数据,还要同步更新索引(比如B+树索引要调整结构);②占用额外存储空间——索引文件可能比原表数据还大,比如一张1G的用户表,索引可能占500M;③优化器可能选错索引——索引太多时,MySQL优化器判断最优索引会出错,反而导致查询变慢。实际工作中只给“查询频繁、区分度高”的字段建索引。

二、索引类型与底层原理类

3.面试官:MySQL常见的索引类型有哪些?InnoDB默认用哪种?各自适用场景是什么?

答案:常见索引分4类,InnoDB默认是B+树索引:

①B+树索引:最常用,分聚簇索引和非聚簇索引。聚簇索引(主键索引)叶子节点存完整数据行,非聚簇索引(二级索引)叶子节点存主键ID;适用所有查询场景(单值查询、范围查询、排序),比如商品表id(主键)、goods_no(唯一索引)都用它。

②哈希索引:基于哈希表实现,查找快但不支持范围查询和排序;适合“等值查询频繁、无范围查询”的场景,比如缓存表的key字段(但InnoDB不支持手动建哈希索引,只能靠自适应哈希索引)。

③全文索引:针对文本内容(比如文章标题、正文)的关键词检索,支持MATCHAGAINST查询;适合博客、新闻的搜索功能,比如article表的content字段。

④前缀索引:取字段前N个字符建索引(比如varchar(255)字段取前20个字符),节省空间;适合长字符串字段(比如user表的email,前缀20个字符已能区分大部分值),但不支持覆盖索引。

4.面试官:聚簇索引和非聚簇索引的区别是什么?为什么InnoDB建议用自增主键当聚簇索引?

答案:核心区别在叶子节点存储内容:

聚簇索引(主键索引):叶子节点=完整数据行,查询时找到索引就拿到全部数据,不用回表;

非聚簇索引(二级索引):叶子节点=主键ID,查询时先查二级索引拿到主键,再查聚簇索引拿数据(这叫“回表”)。

建议用自增主键的原因:①自增主键是有序的,插入数据时B+树不会频繁分裂调整(如果用UUID,无序值会导致B+树频繁重构,性能差);②自增主键占用空间小(4字节int),二级索引叶子节点存主键ID时,能节省更多存储空间(如果用UUID,每个二级索引条目都要存16字节,索引文件会变大)。

5.面试官:什么是覆盖索引?实际工作中怎么用它优化查询?

答案:覆盖索引是“查询需要的字段都在索引里”,不用回表。比如user表有索引idx_name_age(name,age),查询selectname,agefromuserwherename=张三,因为name和age都在索引中,直接查索引就能返回结果,不用回表查聚簇索引。

实际优化场景:比如订单表order(id主键,user_id,order_no,create_time),经常查“用户的订单号和创建时间”(selectorder_no,create_timefromorderwhereuser_id=100),就给user_id和需要的字段建联合索引idx_user_order_create(user_id,order_no,create_time),这样查询就能走覆盖索引,避免回表,速度提升明显。

三、索引设计与优化类

6.面试官:联合索引的“最左前缀原则”是什么?设计联合索引时怎么排序字段顺序?

答案:最左前缀原则是“联合索引只能匹配索引最左边开始的连续字段”。比如联合索引idx_a_b_c(a,b,c),能匹配的查询条件是:

支持:wherea=?、wherea=?andb=?、wherea=?andb=?andc=?(顺序可乱,MySQL优化器会调整);

不支持:whereb=?、wherec=?、whereb=?andc=?(跳过了最左边的a)。

字段顺序设计原则(核心:

文档评论(0)

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

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

1亿VIP精品文档

相关文档