WHERE col IS NULL 不走索引 → 設置默認值 0/空串,查 col = 0col < val OR col > val 或業務層過濾WHERE a=1 OR b=2 多半全掃 → 改 UNION ALL 走各自索引BETWEEN;子查詢 IN 改 EXISTSFORCE INDEX 或拆分語句WHERE col/2=100 → 改 WHERE col=200WHERE SUBSTRING(name,1,3)='abc' → 改 WHERE name LIKE 'abc%'INDEX(a,b,c) 必須從 a 開始用,順序一致SELECT a,b FROM t WHERE c=1 配合 INDEX(c,a,b) 避免回表LIMIT,禁止無限制大查詢VALUES (...),(...) 或 LOAD DATA,減少解析/刷新DROP INDEX,後 CREATE INDEX(connections × buffers) + global_buffers < 物理內存 70%swappiness=1、huge pages、memlockmysqltuner、pt-query-digest、EXPLAIN ANALYZE# 1. 慢查詢分析
pt-query-digest /var/log/mysql/slow.log --limit 20
# 2. 索引使用情況
SELECT * FROM sys.schema_unused_indexes;
SELECT * FROM sys.schema_redundant_indexes;
# 3. 表碎片
SELECT TABLE_NAME, DATA_FREE/1024/1024 AS free_mb
FROM information_schema.TABLES
WHERE DATA_FREE > 100*1024*1024;
# 4. 檢查未命中索引的查詢
SELECT * FROM sys.statements_with_full_table_scans LIMIT 10;
優化無終點,只有持續觀測、量化分析、針對性調整。將上述鐵律內化為代碼審查標準,才能從根源遏制劣質 SQL。