题目:你是如何进行SQL调优的?
难度:medium
标签:mysql/tuning
评分:⭐⭐⭐☆☆(3/5)
我进行 SQL 优化主要看业务情况。一方面根据实际业务确认要返回的结果,尽量不用 * 返回全部列,因为有时只返回很少内容,可以通过覆盖索引;给业务查询字段创建索引,给排序字段创建索引;根据业务情况构建索引,尽可能合并成联合索引;同时控制索引数量,防止过多索引导致写入缓慢和存储压力。
优点:少查列→覆盖索引、过滤/排序建索引、合并联合索引、控制索引数量,四个点都对。
不足:缺方法论主线——定位、分析、改写、结构、验证;排序字段应作为联合索引最后一段,而不是单独建。
补充:用「优化前后 rows_examined / RT」量化;深分页改游标;子查询转 JOIN;OR 转 UNION。
SQL 调优是闭环而不是技巧集合:定位(慢日志、performance_schema)→ 分析(EXPLAIN 的 type/rows/Extra)→ 改写(去函数、去前导百分号、深分页改游标、子查询转 JOIN)→ 结构(字段类型、冗余、分表、归档)→ 验证(压测 + 回归 + 前后指标对比)。
Using filesort 与 Using temporary 的成因与消除limit 1000000,10 要扫描并丢弃前 100 万行,改游标或延迟关联。rows_examined、P99 RT、DB CPU。【一句话结论】 SQL 调优是按「定位、分析、改写、结构、验证」走闭环,不是堆索引。
【三点展开】 第一,先用慢日志和 EXPLAIN 定位是哪条 SQL、慢在扫描还是排序。第二,改写优先:少查列走覆盖索引,去掉列上函数和隐式转换,深分页改游标。第三,索引层面把等值列和排序列合进联合索引,同时控制数量避免写放大。
【一句边界】 当单表数据量和 QPS 都到瓶颈,SQL 层优化收益有限,要往上走到缓存、读写分离或分片。