本文為完整深度版,精簡版請參考文章 172791。內容涵蓋 SQL 微優化、表設計、索引原理、查詢分析工具鏈、主從讀寫分離、分庫分表架構演進。
ALTER TABLE t AUTO_INCREMENT = N,避免 BIGINT 耗盡或業務需求。INT(5) ZEROFILL 顯示 00001,僅影響顯示,存儲不變。DROP INDEX → LOAD DATA → ADD INDEX,避免逐行 B+樹維護,速度提升 10 倍+。mysql -u user -ppass db < backup.sql(-p 緊接密碼)。INT > DATE/TIME > ENUM/CHAR > VARCHAR > BLOB/TEXT
INT UNSIGNED 存 INET_ATON(ip),4 字節 vs 15 字節,範圍查詢極快。TINYINT 或 ENUM,避免 VARCHAR。DECIMAL(19,4) 或 BIGINT 存分(乘 100),嚴禁 FLOAT/DOUBLE。PARTITION BY RANGE (YEAR(created_at)):歷史數據歸檔、分區裁剪。PARTITION BY HASH (user_id):均勻分佈熱點。| 場景 | 推薦引擎 | 理由 |
|---|---|---|
| 核心業務、事務、高併發寫入 | InnoDB | 行鎖、MVCC、崩潰安全、自適應哈希索引 |
| 純讀取、全文搜尋(配合 Sphinx/ES)、日誌歸檔 | MyISAM | 表鎖、COUNT(*) 極快、壓縮表 |
| 緩存層、臨時表、查詢結果集 | MEMORY | 全內存、重啟丟失 |
| 歸檔、只寫一次、大量壓縮 | Archive | 高壓縮比、無索引 |
INDEX idx_a_b_c (a, b, c) 先按 a,再 b,再 c。INDEX idx_name (name(10))。SELECT COUNT(DISTINCT LEFT(name, 10))/COUNT(*) FROM t,目標 > 0.8。REVERSE(url))再建索引。OPTIMIZE TABLE t 或 ALTER TABLE t ENGINE=InnoDB 重建,消除碎片、更新統計信息。ALGORITHM=INPLACE, LOCK=NONE 減少鎖定時間。[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
分析:mysqldumpslow -s t -t 20 /var/log/mysql/slow.log(按耗時 Top 20)。
| 欄位 | 關鍵值 | 優化動作 |
|---|---|---|
| id | 查詢序號 | 多表關聯看執行順序 |
| select_type | SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION | DERIVED (衍生表) 常需優化 |
| table | 訪問表 | |
| type | system > const > eq_ref > ref > range > index > ALL | 避免 ALL/index;爭取 ref/range/eq_ref |
| possible_keys | 候選索引 | 為空則無索引可用 |
| key | 實際使用索引 | 為 NULL 需建索引 |
| key_len | 索引長度 | 推斷聯合索引用了幾列 |
| ref | 關聯列/常數 | |
| rows | 預估掃描行 | 越小越好;配合 filtered 看過濾率 |
| Extra | Using index (覆蓋) / Using where / Using filesort / Using temporary | filesort/temporary 需優化;Using index 最佳 |
SET profiling = 1;
-- 執行目標查詢
SHOW PROFILES;
-- 找到 Query_ID
SHOW PROFILE CPU, BLOCK IO, MEMORY FOR QUERY ;
定位 CPU、IO、內存熱點,指導索引/結構調整。
CHANGE MASTER TO MASTER_AUTO_POSITION=1。rpl_semi_sync_master=1,主庫等待至少一個 Slave 收到 Binlog 再提交,強一致性。| 維度 | 垂直切分 | 水平切分 | 聯合切分 |
|---|---|---|---|
| 觸發條件 | 表多、業務模組耦合低 | 單表大(>2000萬行/20GB) | 表多且單表大 |
| 方式 | 按業務拆庫 | Hash/Range 拆表/庫 | 矩陣式分佈 |
| 中介 | 應用層路由或 ShardingSphere/Mycat | 分片鍵路由 | 複雜路由規則 |
| 挑戰 | 分佈式事務、跨庫 JOIN | 分片鍵選擇、遷移、全局唯一 ID | 綜合上述 |
每個優化點均可深入展開為專題,建議建立團隊《MySQL 優化實戰手冊》,持續迭代。