官方文档:
https://dev.mysql.com/doc/refman/8.0/en/optimization.html
《高性能MySQL》指导
性能优化
1.表优化
2.索引优化
3.查询优化
4.服务器优化
5.系统与硬件优化
稳定优化
1.复制
2.可拓展
3.高可用,避免单点失效等
4.云
5.备份恢复
1.表优化
选择合适的数据类型
减少列和关联
反范式冗余
缓存表、计数器表
2.索引优化
索引独立放在符号的一侧
前缀/翻转后缀索引
合适的多列索引顺序(以最左边的为起点任何连续的索引都能匹配)
聚簇索引(索引组织表)
覆盖需要返回字段索引
索引排序
压缩
移除冗余和重复索引
(唯一和主键都是索引)
索引减少锁定
3.查询优化
减少访问和返回
多个简单查询以便缓存和短锁
切分减少锁持续
最值加 LIMIT 1
没有 WHERE 的 COUNT() 是直接获得
用 COUNT() - 少数行查询
使用 EXPLAIN 估算
去除 DISTINCT 以避免排序
确保 ON 或 USING 子句上有索引
确保汇总排序只涉及一个表才有可能用索引
MySQL5.5 使用关联查询代替子查询
先LIMIT再关联
返回多一条数据如果没有就不下一页
UNION ALL 以避免自动 DISTINCT
其他指导
or 用 in 代替,或者 UNION ALL 代替后在应用层处理重复数据
GROUP BY确认不需要排序时用ORDER BY NULL 避免多余排序
导入数据前set unique_checks=0导好设1
insert delayed异步合并写入,但宕机丢数据
高速查询
userServerPrepStmts=true
cachePrepStmts=true
高速插入(同时用手动提交事务)
useServerPrepStmts=false
rewriteBatchedStatements=true
useCompression=true
join 空分开
select * from a
join b
on a.k is not null
and a.k = b.k
union all
select * from a
where a.k is null
SQL 执行顺序:
FROM -> WHERE ->
GROUP BY -> HAVING ->
SELECT -> DISTINCT ->
TOP -> ORDER BY