SQL性能优化面试题_慢查询与索引考点

6次阅读

SQL性能优化面试题_慢查询与索引考点

面试中问sql性能优化,核心就盯两点:慢查询怎么找、索引怎么用。不是背概念,是看你能不能快速定位问题、说清为什么、给出可落地的改法。

怎么定位慢查询

不能只答“开慢日志”。要分场景说清楚:

  • 线上有监控(比如skywalkingprometheus+grafana),优先看链路追踪——直接看到哪个接口耗时高、哪条SQL拖后腿,还能查调用频次和平均耗时
  • 没监控就靠mysql原生日志:在my.cnf里配slow_query_log=1long_query_time=0.5(生产建议设0.5秒,别用默认10秒)、log_queries_not_using_indexes=ON(抓漏建索引的语句)
  • 日志大了别用cat硬翻,用mysqldumpslow -s t -t 5 /var/lib/mysql/slow.log按执行时间倒序取前5条,一眼揪出最慢的

EXPLAIN怎么看关键指标

面试官常让你现场分析一条SQL,重点盯这四个字段:

  • type:越靠前越好,consteq_refref算走索引;range是范围扫描还行;ALL就是全表扫描,得立刻优化
  • key:显示实际用了哪个索引,NULL说明没走索引,或者走了但被优化器放弃了
  • rows:预估扫描行数,从几万跳到几百,基本就是索引生效了
  • Extra:出现Using filesortUsing temporary要警惕,说明排序/分组没走索引,可能需要调整索引或语句

索引怎么建才不踩坑

光说“加索引”没用,得讲清逻辑和边界:

  • 联合索引必须遵守最左前缀:比如(user_id, create_time, pay_status),能命中WHERE user_id = ?user_id = ? AND create_time > ?,但create_time > ?单独用就失效
  • 范围查询(>BETWEENLIKE 'abc%')右边的列无法走索引,所以把高选择性字段放左边,时间范围放右端
  • 覆盖索引很实用:比如查select order_no, create_time FROM tb_order WHERE user_id = ?,建(user_id, order_no, create_time)就能避免回表
  • 这些操作会让索引直接失效:对索引列做函数(YEAR(create_time)=2025)、隐式类型转换varchar字段传数字)、OR连非索引字段、LIKE '%搜索'

其他高频考点补漏

这几个点常被追问,提前准备好简明回答:

  • 深分页怎么优化LIMIT 1000000, 10不要硬查,改用延迟关联(先查ID再JOIN)或游标法(记录上一页最大ID,下页用WHERE id > xxx
  • 为什么不用SELECT *:多读无用字段增加网络传输、内存开销,还容易让覆盖索引失效
  • 索引越多越好吗:不是。写操作(INSERT/UPDATE/delete)要维护索引,索引本身也占磁盘空间,低频查询或区分度极低的字段(如性别)不值得建索引
text=ZqhQzanResources