MySQL 優化是一項系統工程,涵蓋資料庫設計、SQL 語句、架構拆分三大維度。本文結合實戰案例,從三範式到 HandlerSocket,為你構建完整優化知識體系。
為查詢效能,可在「寫少讀多」、「大表關聯查詢頻繁」場景引入冗餘欄位(如訂單表存冗餘用戶名),但需透過觸發器或應用層保證一致性。
SHOW STATUS LIKE 'Com_%' 掌握負載畫像EXPLAIN 分析執行計劃# 監控併發與慢查詢
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
# 慢查詢閾值動態調整
SET GLOBAL long_query_time = 1; # 秒,生產建議 1~2 秒
| 場景 | 建議 | 避坑指南 |
|---|---|---|
| 高頻 WHERE/JOIN/ORDER BY/GROUP BY 欄位 | 建立單列或組合索引 | 區分度極低(如性別、狀態)勿建單列索引 |
| 組合索引 | 遵循最左前綴,高區分度列靠左 | 查詢未用到最左列 → 索引失效 |
| LIKE 查詢 | col LIKE 'prefix%' 可用索引 | %suffix、%keyword% 導致全掃 |
| 隱式轉換 | 字串欄位條件必加引號 | WHERE phone = 13800000000 導致索引失效 |
| OR 條件 | 改寫為 UNION ALL 或建立聯合索引 | 單獨索引配合 OR 通常不走索引 |
SHOW STATUS LIKE 'Handler_read%';
# Handler_read_key 高 = 索引命中好
# Handler_read_rnd_next 高 = 全表掃描多
ALTER TABLE t DISABLE KEYS; LOAD DATA...; ALTER TABLE t ENABLE KEYS;SET unique_checks=0; SET autocommit=0; → 批次提交 → 恢復設置。將大字段(如 TEXT、BLOB)、低頻欄位拆到獨立表,主表只保高頻欄位,減少 I/O、提升緩存命中。
-- 原表:user_info(id, name, age, email, intro)
-- 拆分後:
CREATE TABLE user_base (id PK, name, age, email);
CREATE TABLE user_intro (id PK, intro);
按 id % N、時間範圍、租戶 ID 等策略將數據分散到結構相同的多張表。
-- 取模 2 示例
CREATE TABLE user_0 LIKE user;
CREATE TABLE user_1 LIKE user;
-- 應用層路由:id % 2 決定寫入 user_0 或 user_1
注意:分表後跨分片查詢、事務、全局唯一 ID 需額外解決方案(如分布式 ID 生成器、中間件 ShardingSphere)。

關鍵指標:主從延遲(Seconds_Behind_Master),監控報警 + 半同步複制(rpl_semi_sync_master_enabled=1)保障數據安全。
針對極高 QPS 的單鍵查詢(PK Lookup),HandlerSocket 作為 MySQL Daemon Plugin 直接走 InnoDB 存儲引擎 API,繞過 SQL 解析、優化器、鎖開銷,實測單機 75 萬+ QPS,遠超 Memcached。適用場景:用戶資料查詢、Session 讀取、計數器高併發增減。
EXPLAIN 驗證?優化無終點,唯有持續觀測、迭代,才能駕馭業務增長帶來的壓力。