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中用于快速查询数据的“数据结构”(类似书籍目录),本质是通过提前维护有序的数据结构,减少查询时的磁盘IO次数。

需要索引的核心原因:无索引时查询会走“全表扫描”(逐行检查数据),当表数据量达到百万/千万级时,查询会非常慢;索引能将查询时间从“秒级/分钟级”压缩到“毫秒级”,但会占用额外存储空间,且增删改操作需维护索引(有轻微性能损耗)。

2.MySQL常见的索引类型有哪些?分别适用什么场景?

答案:

主要分4类,适用场景不同:

主键索引(PRIMARYKEY):唯一标识数据,默认非空且唯一,InnoDB中是聚簇索引,适合作为表的唯一标识(如用户ID、订单ID);

唯一索引(UNIQUE):确保字段值唯一(允许NULL,多个NULL不冲突),适合需要唯一性约束的字段(如手机号、邮箱);

普通索引(INDEX):无唯一性约束,适合频繁作为查询条件的字段(如商品分类ID、用户性别);

联合索引(复合索引):多字段组合的索引(如INDEX(a,b,c)),适合频繁用“多字段联合查询”的场景(如电商中“用户ID+订单状态”查询)。

3.为什么InnoDB默认用B+树做索引结构,而不是哈希、B树?

答案:

从查询需求和性能角度分析:

哈希:适合等值查询(key→value直接映射),但无法支持范围查询(如、、between)和排序,而MySQL中范围查询很常见(如查“价格100的商品”),所以不适用;

B树:叶子节点和非叶子节点都存数据,导致非叶子节点存储的索引项少,树的高度更高(磁盘IO次数多);且范围查询需要回溯节点,效率低;

B+树:①非叶子节点只存索引值,叶子节点存完整数据(聚簇索引)或主键(二级索引),树更矮,IO更少;②叶子节点按顺序链表连接,范围查询和排序直接遍历链表即可,完美匹配MySQL的查询场景。

4.聚簇索引和非聚簇索引的区别是什么?InnoDB和MyISAM在这方面有什么不同?

答案:

核心区别是“叶子节点是否存储完整数据”:

聚簇索引:叶子节点存的是“完整数据行”,查询命中后无需再查其他地方(一次IO);一张表只有一个聚簇索引(InnoDB中默认主键是聚簇索引,无主键则选唯一索引,再无则生成隐藏行ID);

非聚簇索引:叶子节点存的是“主键值”,查询命中后需用主键值回表查完整数据(两次IO),普通索引、唯一索引都属于非聚簇索引。

InnoDB和MyISAM的差异:

InnoDB:有聚簇索引(主键)和非聚簇索引(其他索引),非聚簇索引依赖主键回表;

MyISAM:所有索引都是非聚簇索引,叶子节点存的是“数据行的物理地址”,不依赖主键,且主键和普通索引无本质区别。

5.联合索引的“最左前缀原则”是什么?举个例子说明。

答案:

联合索引(如a,b,c)的查询生效规则是:必须从索引的“最左边第一个字段”开始匹配,中间不能跳过,否则索引失效。

例子:

联合索引为idx_abc(a,b,c),不同查询的生效情况:

wherea=1→生效(匹配最左前缀a);

wherea=1andb=2→生效(匹配a+b);

wherea=1andb=2andc=3→生效(全匹配);

whereb=2→失效(跳过a,不满足最左前缀);

wherea=1andc=3→仅a字段生效,c字段不生效(跳过b)。

注意:如果查询用了“覆盖索引”(如selecta,bfromtablewherea=1andc=3),此时虽然c不生效,但因查询字段都在索引里,无需回表,性能仍比全表扫描好。

6.哪些情况会导致索引失效?举3个常见场景并说明如何避免。

答案:

常见失效场景及避免方法:

对索引字段做函数/运算操作:

例:whereleft(name,1)=张(name是索引字段),此时索引失效(MySQL无法直接用索引匹配函数结果);

避免:改成wherenamelike张%(左模糊匹配,索引生效)。

索引字段类型不匹配(隐式转换):

例:字段phone是varchar类型(索引),查询wherephone传数字),MySQL会自动做cast(phoneasint)转换,导致索引失效;

避免:传值类型和字段类型一致,改成wherephone

用“不等于”“notin”“isnotnull”:

文档评论(0)

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

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

1亿VIP精品文档

相关文档