全书目录

第十八篇:MySQL 完全指南 —— 城市户籍总账宇宙

第十三章:性能基础 —— 总账楼不能每次都翻全城

2 分钟 555 字 第 348 / 962 个阅读单元

MySQL 性能优化,初学阶段先抓最值钱的几条。

1. 先看查询,再建索引

错误思路:

text
这个字段看起来重要 -> 建索引

正确思路:

text
这条查询高频且慢 -> 看过滤条件 / 连接条件 / 排序条件 -> 再决定索引

2. 学会用 EXPLAIN 看执行计划

sql
EXPLAIN
SELECT
  c.full_name,
  h.household_no
FROM citizens AS c
JOIN households AS h
  ON h.household_id = c.household_id
WHERE c.household_id = 2
  AND c.status = 'active';

在 MySQL 的 EXPLAIN 里,先重点看这些列:

  • type:访问方式,是否在高效查找
  • possible_keys:理论可用索引
  • key:实际选中的索引
  • rows:估计要扫多少行
  • Extra:有没有额外代价,比如临时表、额外过滤等

3. 避免无谓的全表扫描

下面这种写法很常见,但代价可能很大:

sql
SELECT *
FROM citizens
WHERE YEAR(birth_date) = 1998;

因为你对列做了函数处理,索引往往更难发挥作用。

更常见的可优化写法是:

sql
SELECT *
FROM citizens
WHERE birth_date >= '1998-01-01'
  AND birth_date <  '1999-01-01';

4. 连接字段类型要一致

如果一边是 BIGINT,一边是 VARCHAR,MySQL 可能需要转换,索引利用会变差。

5. 不要默认 SELECT *

柜员查一个页面,也许只需要:

  • 姓名
  • 户号
  • 区名

那就只拿这些列。

6. 深分页要谨慎

sql
SELECT *
FROM citizens
ORDER BY citizen_id
LIMIT 100000, 20;

这种偏移量很深的分页,代价常常不小。大数据量时,基于上次主键位置继续翻页,通常更稳。

7. 写入性能也会被索引反噬

索引越多,插入和更新越重。不要把每个字段都建索引。

8. 用 ANALYZE TABLE 维护统计信息

sql
ANALYZE TABLE citizens, households, districts;

优化器做决定时要依赖统计信息。统计太旧,计划就可能变差。

一句话总结性能基础:

先理解访问路径,再谈优化;先看执行计划,再决定加什么索引。