MySQL优化高频面试题及详细答案(实战向)_第1页
MySQL优化高频面试题及详细答案(实战向)_第2页
MySQL优化高频面试题及详细答案(实战向)_第3页
MySQL优化高频面试题及详细答案(实战向)_第4页
MySQL优化高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MySQL优化高频面试题及详细答案(实战向)说明:所有题目为互联网真实面试高频题,答案摒弃书面化套话,以实操落地、面试得分点为主,适合面试背诵、技术复盘。一、基础原理与存储引擎优化1、InnoDB和MyISAM的核心区别?日常业务为什么优先用InnoDB?参考答案:核心区别主要5点:1)事务支持:InnoDB支持事务、ACID特性;MyISAM不支持事务。2)锁机制:InnoDB是行级锁+表级锁;MyISAM只有表级锁。3)并发能力:InnoDB并发高,读写不冲突;MyISAM写锁会阻塞所有读写,并发极差。4)崩溃恢复:InnoDB有redo/undo日志,宕机可恢复数据;MyISAM宕机大概率数据损坏。5)外键:InnoDB支持外键,MyISAM不支持。业务选型结论:绝大多数线上业务都需要事务、高并发读写、数据安全,所以默认用InnoDB。只有纯静态、极少修改、不用事务的日志表、统计表,才会偶尔用MyISAM。2、InnoDB的四大特性是什么?各自作用?参考答案:1)插入缓冲:对非唯一二级索引的插入做缓存,减少磁盘IO,提升插入速度。2)二次写:解决页断裂问题,保证数据页写入安全,崩溃后可恢复页数据。3)自适应哈希索引:InnoDB自动为热点页建立哈希索引,提升等值查询效率,无需人工维护。4)redo/undo日志:redo保证事务持久性,宕机重启重做日志恢复数据;undo保证事务原子性,用于回滚和MVCC。3、MVCC原理是什么?解决了什么问题?参考答案:MVCC即多版本并发控制,是InnoDB实现读写不加锁、隔离级别的核心机制。核心原理:每条数据行都会保存多个历史版本,通过undo日志生成数据快照,不同事务读取不同版本的数据。依赖三个核心字段:行隐藏ID、事务ID、undo指针。解决的问题:1)解决读阻塞写、写阻塞读的问题,大幅提升并发性能;2)实现了可重复读、读已提交两种隔离级别;3)避免了不加锁的幻读、脏读、不可重复读问题(可重复读级别下基本解决幻读)。二、索引优化(面试核心重点)4、主键索引、普通索引、联合索引、覆盖索引的区别?参考答案:1)主键索引(聚簇索引):叶子节点存整行数据,一张表只有一个,查询速度最快,直接拿到完整数据。2)普通索引(二级索引):叶子节点只存索引列+主键,查到后需要回表查询整行数据。3)联合索引:多个字段组合的索引,遵循最左匹配原则,适合多字段查询场景。4)覆盖索引:查询的所有字段都在索引中,不需要回表,是效率最高的索引查询方式。优化重点:日常优化优先尽量走覆盖索引,减少回表IO。5、什么是最左匹配原则?失效场景有哪些?参考答案:联合索引遵循最左前缀匹配,查询条件必须匹配索引最左边的字段,索引才会生效。举例:索引(a,b,c)有效:wherea=?、wherea=?andb=?、wherea=?andb=?andc=?失效:whereb=?、wherec=?、whereb=?andc=?常见索引失效场景(高频):1)不满足最左前缀;2)索引列做运算、函数、类型转换;3)like%前置模糊查询(%xxx);4)or连接的字段有非索引列;5)in、notin、notexists数据量过大;6)MySQL优化器判断全表扫描比索引更快,主动放弃索引。6、回表是什么?怎么避免回表?参考答案:普通二级索引只能查到索引列和主键,想要获取其他字段数据,需要通过主键再去聚簇索引查一次,这个过程就是回表,会增加IO开销。避免回表的核心方案:1)建立覆盖索引,把查询、筛选、排序的字段全部放进联合索引;2)避免select*,只查需要的字段,更容易命中覆盖索引;3)高频查询场景优先设计窄索引,减少索引体积,提升缓存命中率。7、索引不是越多越好?为什么?参考答案:索引只提升查询效率,会降低增删改效率。原因:1)增删改数据时,不仅要改数据页,还要同步修改所有相关索引页,索引越多,IO开销越大;2)索引会占用磁盘和内存空间,索引过多会导致缓冲池中有效数据变少,缓存命中率下降;3)优化器选择执行计划时,需要遍历所有索引,索引过多会增加解析耗时。实操原则:高频查询建索引,低频查询不建索引,废弃索引及时删除。8、唯一索引和普通索引怎么选型?参考答案:1)业务字段本身唯一(手机号、身份证、订单号),必须建唯一索引,既能约束数据,查询效率也略高;2)字段允许重复、仅用于查询筛选,用普通索引;3)高频更新字段尽量不用唯一索引,唯一索引校验成本更高,更新性能更差。三、SQL语句优化(实操高频)9、explain关键字怎么用?重点看哪几个字段?参考答案:explain用于分析SQL执行计划,定位慢SQL问题,直接加在SQL前执行即可。核心必看字段(面试重点):1)type:访问类型,优先级system>const>eq_ref>ref>range>index>all。日常业务至少要达到ref/range,出现all就是全表扫描,必须优化。2)key:实际命中的索引,为null代表未走索引。3)rows:扫描行数,数值越大越慢,优化核心就是减少rows。4)Extra:额外信息,出现Usingfilesort(文件排序)、Usingtemporary(临时表)都是需要优化的信号。10、Usingfilesort、Usingtemporary怎么优化?参考答案:Usingfilesort:代表MySQL没走索引排序,而是磁盘文件排序,效率极低。优化:将orderby、groupby的字段加入联合索引,利用索引有序特性,避免文件排序。Usingtemporary:代表查询生成了临时表,常见于groupby、distinct、多表关联。优化:优先通过索引优化分组、去重字段;减少不必要的distinct;拆分复杂SQL,避免单SQL多逻辑处理。11、select*为什么慢?日常开发怎么规范?参考答案:1)查询所有字段,无法触发覆盖索引,必然回表,增加IO;2)会查询大量无用字段,增加网络传输、内存、磁盘开销;3)表结构变更后,可能查出多余字段,引发程序报错。规范:坚决禁止select*,按需查询指定字段,高频场景配合覆盖索引使用。12、in和exists怎么选型?or和union怎么优化?参考答案:1)in:小表驱动大表,子查询结果集小时用in;2)exists:大表驱动小表,外层表数据量小时用exists;3)or条件:多个or字段尽量都建索引,否则全表扫描;能拆分SQL就拆分,或用union替代;4)union会去重、效率低,不需要去重优先用unionall。13、limit分页深偏移慢怎么优化?参考答案:问题:limit100000,10会先扫描10万行,再丢弃,耗时极高。四种落地优化方案:1)主键分页(最优):whereid>上一页最大idlimit10,避免偏移;2)延迟关联:先通过索引查出主键,再关联查询数据,减少回表开销;3)禁止前端深分页,业务上限制最大页码;4)大数据量分页场景,用ES替代MySQL。四、锁与事务优化14、InnoDB行锁和表锁的触发场景?参考答案:行锁触发:精准命中索引、等值查询、唯一索引,仅锁定匹配行,并发高。表锁触发:1)无索引、索引失效,行锁退化为表锁;2)altertable修改表结构;3)MyISAM引擎默认表锁。优化核心:保证更新、删除语句一定走有效索引,避免行锁升级表锁,防止大面积阻塞。15、什么是死锁?怎么避免和解决?参考答案:死锁是两个及以上事务互相持有对方需要的锁,互相等待,无限阻塞。避免方案:1)统一表的更新顺序,所有事务更新多张表时顺序一致;2)缩短事务粒度,事务内不做复杂逻辑、不休眠、不查无关数据;3)避免一次性锁定过多资源;4)设置超时时间、开启死锁检测,自动释放死锁事务。16、事务慢的原因和优化方案?参考答案:慢的核心原因:事务执行时间过长、锁持有太久、SQL效率低。优化:1)小事务原则,能拆分绝不合并,减少锁等待时间;2)事务内只保留增删改核心SQL,查询、外部接口调用、业务计算全部移出事务;3)优化事务内SQL索引,避免全表扫描导致锁范围扩大;4)避免大事务批量更新、批量删除,拆分批次执行。五、数据库配置与架构优化17、核心配置参数优化有哪些?参考答案:1)innodb_buffer_pool_size:核心参数,单机专属MySQL设置为物理内存50%-70%,缓存数据和索引,减少磁盘IO;2)innodb_log_file_size:日志文件大小,线上一般设置1-4G,减少日志切换频率;3)max_connections:最大连接数,根据业务调整,避免过小报连接不足,过大耗尽资源;4)slow_query_log:开启慢查询日志,设置阈值(默认1秒),定期清理优化慢SQL;5)join_buffer_size、sort_buffer_size:按需调整,不盲目调大,避免内存浪费。18、大表优化方案(千万级数据)参考答案:1)索引优化:精简索引,只保留高频查询索引,避免索引冗余;2)冷热数据分离:历史冷数据归档到备份表,只保留热数据在主表;3)分库分表:数据超千万、亿级,按时间、用户ID哈希做水平分表;4)读写分离:主库写、从库读,分担主库压力;5)缓存优化:热点数据用Redis缓存,减少MySQL查询压力;6)禁止大字段:text、blob大字段拆分到附属表,减少主表数据体积。19、读写分离原理?解决什么问题?有什么坑?参考答案:原理:主库负责写入、更新,从库通过binlog同步主库数据,负责查询读请求。解决问题:分担主库压力,提升数据库整体并发和查询能力。常见坑:1)主从延迟:写入后立即读从库,可能读不到最新数据;2)数据同步延迟导致数据不一致;3)从库故障、同步中断影响读业务;4)需要手动做读写路由,增加代码复杂度。六、慢SQL排查完整流程(面试压轴题)20、线上遇到慢SQL,你的排查优化流程是什么?参考答案(完整面试得分流程):1、定位慢SQL:开启慢查询日志,根据耗时、扫描行数、执行频率筛选问题SQL;2、分析执行计划:用explain查看type、rows、Extra,判断是否全表扫描、无索引、文件排序、临时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论