官方文檔:
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