- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
MySQL数据库面试题及答案(实战版)
一、基础原理类
1.说说MySQL的存储引擎有哪些,InnoDB和MyISAM的核心区别?
答案:
常用存储引擎有InnoDB、MyISAM、Memory等,其中InnoDB是MySQL5.5+默认引擎。核心区别:
事务支持:InnoDB支持ACID事务,MyISAM不支持;
锁机制:InnoDB支持行级锁和表级锁,MyISAM仅支持表级锁(写操作会阻塞全表读);
索引结构:InnoDB的主键索引是聚簇索引(数据和索引存一起),辅助索引存主键ID;MyISAM是非聚簇索引(数据和索引分离);
崩溃恢复:InnoDB有redo/undo日志,崩溃后可恢复;MyISAM恢复困难,可能丢数据;
适用场景:InnoDB适合写多读少、需要事务的场景(如电商订单);MyISAM适合读多写少、不需要事务的场景(如博客文章)。
2.什么是聚簇索引和非聚簇索引?InnoDB为什么推荐用自增主键当聚簇索引?
答案:
聚簇索引:索引和数据物理存储在一起,索引的叶子节点就是数据行,一张表只有一个聚簇索引;
非聚簇索引:索引和数据分开存储,索引叶子节点存的是数据行的地址(或主键ID),一张表可以有多个。
InnoDB用自增主键当聚簇索引的原因:
自增主键是连续的,插入新数据时不会导致索引页分裂(如果用非自增主键,插入时可能需要挪动已有数据,影响性能);
聚簇索引的叶子节点存全量数据,查询时如果命中聚簇索引,无需回表,效率高;
辅助索引只存主键ID,比存其他字段更节省空间。
3.MySQL事务的ACID是指什么?InnoDB如何保证ACID?
答案:
A(原子性):事务要么全执行,要么全回滚;
C(一致性):事务执行前后,数据总状态一致(如转账前后总金额不变);
I(隔离性):多个事务并发执行时,相互不干扰;
D(持久性):事务提交后,数据变更永久保存。
InnoDB的实现方式:
原子性/一致性:通过undo日志(记录数据修改前的状态,回滚时恢复);
持久性:通过redo日志(记录数据修改后的状态,崩溃后重做已提交事务);
隔离性:通过锁机制+MVCC(多版本并发控制)。
二、索引与查询优化类
1.索引的作用是什么?常见的索引类型有哪些?
答案:
作用:加快查询速度(减少磁盘I/O次数),约束数据(如唯一索引保证数据不重复)。
常见类型:
按数据结构:B+树索引(默认,适合范围查询)、哈希索引(适合等值查询,不支持范围)、全文索引(适合文本模糊查询);
按功能:主键索引(唯一非空)、唯一索引(唯一,可空)、普通索引(无约束)、联合索引(多字段组合)。
2.什么是联合索引的“最左前缀原则”?举个例子说明。
答案:
联合索引(a,b,c)的索引树是按a→b→c的顺序构建的,查询时必须从最左列a开始匹配,否则无法命中索引。
示例:
命中索引:wherea=1;wherea=1andb=2;wherea=1andb=2andc=3;
不命中索引:whereb=2;wherec=3;wherea=1andc=3(跳过b,无法命中后续列)。
注意:如果查询条件中a是范围查询(如a1),则b和c的索引会失效,只能用到a的索引。
3.哪些情况会导致索引失效?如何优化?
答案:
常见索引失效场景:
函数或运算操作索引列(如wheredate(create_time)=2024-01-01、whereid+1=10);
字符串不加引号(如wherephonephone是varchar类型,会触发隐式转换);
使用or连接非索引列(如wherea=1orb=2,b无索引则全表扫描);
like以%开头(如wherenamelike%张三,无法命中索引;like张三%可以命中);
联合索引不满足最左前缀原则。
优化方案:
避免索引列做函数/运算,改在参数上操作(如wherecreate_time=2024-01-0100:00:00andcreate_time2024-01-0200:00:00);
字符串查询加引号,保持类型一致;
or连接的字段都加索引,或改用union;
模糊查询尽量用右模糊,如需左模糊,考虑全文索引或业务调整;
联合索引设计时贴合查询场景,把常用查询字段放左边。
4.如何优化MySQL慢查询?
答案:
定位慢查询:开启慢查询日志(slow_query_log=1),设置慢查询阈值(long_query_time=1秒),通过exp
原创力文档


文档评论(0)