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

5次阅读

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

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

怎么定位慢查询

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

  • 线上有监控(比如 Skywalking、Prometheus+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