MySQL 性能优化,初学阶段先抓最值钱的几条。
1. 先看查询,再建索引
错误思路:
这个字段看起来重要 -> 建索引正确思路:
这条查询高频且慢 -> 看过滤条件 / 连接条件 / 排序条件 -> 再决定索引2. 学会用 EXPLAIN 看执行计划
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. 避免无谓的全表扫描
下面这种写法很常见,但代价可能很大:
SELECT *
FROM citizens
WHERE YEAR(birth_date) = 1998;因为你对列做了函数处理,索引往往更难发挥作用。
更常见的可优化写法是:
SELECT *
FROM citizens
WHERE birth_date >= '1998-01-01'
AND birth_date < '1999-01-01';4. 连接字段类型要一致
如果一边是 BIGINT,一边是 VARCHAR,MySQL 可能需要转换,索引利用会变差。
5. 不要默认 SELECT *
柜员查一个页面,也许只需要:
- 姓名
- 户号
- 区名
那就只拿这些列。
6. 深分页要谨慎
SELECT *
FROM citizens
ORDER BY citizen_id
LIMIT 100000, 20;这种偏移量很深的分页,代价常常不小。大数据量时,基于上次主键位置继续翻页,通常更稳。
7. 写入性能也会被索引反噬
索引越多,插入和更新越重。不要把每个字段都建索引。
8. 用 ANALYZE TABLE 维护统计信息
ANALYZE TABLE citizens, households, districts;优化器做决定时要依赖统计信息。统计太旧,计划就可能变差。
一句话总结性能基础:
先理解访问路径,再谈优化;先看执行计划,再决定加什么索引。