
面试中问SQL性能优化,核心就盯两点:慢查询怎么找、索引怎么用。不是背概念,是看你能不能快速定位问题、说清为什么、给出可落地的改法。
怎么定位慢查询
不能只答“开慢日志”。要分场景说清楚:
- 线上有监控(比如Skywalking、Prometheus+Grafana),优先看链路追踪——直接看到哪个接口耗时高、哪条SQL拖后腿,还能查调用频次和平均耗时
- 没监控就靠MySQL原生日志:在my.cnf里配
slow_query_log=1、long_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,重点盯这四个字段:
数据本地化解决接口缓存数据无限增加,读取慢的问题,速度极大提升更注重SEO优化优化了系统的SEO,提升网站在搜索引擎的排名,增加网站爆光率搜索框本地化不用远程读取、IFRAME调用,更加容易应用及修改增加天气预报功能页面增加了天气预报功能,丰富内容增加点评和问答页面增加了点评和问答相关页面,增强网站粘性电子地图优化优化了电子地图的加载速度与地图功能酒店列表增加房型读取酒店列表页可以直接展示房型,增
-
type:越靠前越好,
const≈eq_ref≈ref算走索引;range是范围扫描还行;ALL就是全表扫描,得立刻优化 -
key:显示实际用了哪个索引,
NULL说明没走索引,或者走了但被优化器放弃了 - rows:预估扫描行数,从几万跳到几百,基本就是索引生效了
-
Extra:出现
Using filesort或Using temporary要警惕,说明排序/分组没走索引,可能需要调整索引或语句
索引怎么建才不踩坑
光说“加索引”没用,得讲清逻辑和边界:
- 联合索引必须遵守最左前缀:比如
(user_id, create_time, pay_status),能命中WHERE user_id = ?或user_id = ? AND create_time > ?,但create_time > ?单独用就失效 - 范围查询(
>、BETWEEN、LIKE '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)要维护索引,索引本身也占磁盘空间,低频查询或区分度极低的字段(如性别)不值得建索引










