能寫出跑通的 SQL 與能治理生產資料庫,中間隔著無數個深夜排查。本文沉澱四大核心技能模組:SHOW PROCESSLIST 狀態機深度解碼、CHECKSUM 與 LOAD DATA 資料遷移鐵三角、索引設計的「克制哲學」、複雜多表增刪改事務控制,每項均附真實故障案例與可直接落地的最佳實踐。
SHOW FULL PROCESSLIST \G -- 關鍵維度:Id, User, Host, db, Command, Time, State, Info, Progress
高頻 State 深度解碼與應對決策樹:
| State | 本質 | 典型誘因 | 標準動作 |
|---|---|---|---|
| Sleep | 連線閒置 | 連線池洩漏、未顯式 close、長事務未提交 | 應用層排查、縮短 wait_timeout/interactive_timeout、定時 kill 閒置進程 |
| Waiting for net / Reading/Writing to net | 網路協棧等待 | 結果集過大、頻寬飽和、跨可用區延遲 | 優化查詢縮小結果集、啟用 protocol_compression、就近路由 |
| Locked | 表級鎖等待 | MyISAM 長查詢/全表掃描阻塞寫入、DDL 執行中 | 遷移 InnoDB 行鎖、拆分大查詢、維護窗口執行 DDL、Online DDL 工具 |
| Copy to tmp table | 內部臨時表物化 | 索引缺失導致無法覆蓋、複雜 JOIN/ORDER BY/GROUP BY/DISTINCT | 補齊複合索引、拆分查詢、調大 tmp_table_size/max_heap_table_size、避免 SELECT * |
| Sending data | 存儲引擎層讀取行並發送 | 掃描行數過多(索引失效/全表掃)、隨機 I/O、大結果集 | EXPLAIN 分析補索引、覆蓋索引、分頁優化、縮小選擇列、分區裁剪 |
| Sorting for group/order | 文件排序/索引排序 | 排序列無索引、sort_buffer_size 不足觸發磁碟臨時表 | 建立符合順序的複合索引、適度增大 sort_buffer_size、避免 filesort |
| Storing result to query cache | 查詢快取寫入 | 快取碎片化、鎖競爭、頻繁失效 | FLUSH QUERY CACHE、調優 query_cache_size/min_res_unit、或直接關閉 QC |
| Freeing items | 查詢結束釋放資源 | 磁碟滿/損壞導致刷盤阻塞、極高 I/O 壓力下清理緩慢 | 檢查磁碟健康、iostat/iotop 定位熱點、優化慢查詢降低 I/O 壓力 |
實戰復盤:某電商大促資料庫全鎖,SHOW PROCESSLIST 顯示 200+ 進程堆積在 Copy to tmp table。根因:某新上線報表查詢 5 表 JOIN 缺乏關聯索引,產生百萬級臨時表佔滿 tmpdir 磁碟。KILL 該會話 + 緊急加索引,30 秒恢復。教訓:上線前必跑 EXPLAIN、建立自動化慢查詢/阻塞告警、tmpdir 掛載高效能 SSD。
C:/data/file.csv 或雙反斜線 C:\\data\\file.csvFILE 權限且檔案在 secure_file_priv 目錄LOCAL 關鍵字指定客戶端讀取並經網路傳輸,適合跨機器導入SET NAMES utf8mb4; → 導入 → SET NAMES default;UNIQUE INDEX,兼具約束與加速雙重收益BIGINT AUTO_INCREMENT,嚴禁 UUID/MD5/業務字串作主鍵(導致頁分裂、二級索引膨脹、寫入放大)pt-index-usage 識別從未使用的索引 → DROP;pt-duplicate-key-checker 檢測冗餘/重複索引 → 合併-- 多表 UPDATE(別名強制、SET 前列出目標表) UPDATE t1 LEFT JOIN t2 ON t1.uid = t2.uid SET t1.name = t2.name, t1.desc = 'updated' WHERE t1.date = '2023-10-11'; -- 多表 DELETE(DELETE 後明確列出要刪除的表別名) DELETE t1, t2, t3 FROM t1 LEFT JOIN t2 ON t1.uid = t2.uid INNER JOIN t3 ON t2.uid = t3.uid WHERE t1.date = '2023-10-11'; -- 顯式事務邊界(業務原子性保障) SET @@autocommit = 0; START TRANSACTION; UPDATE account SET balance = balance - 100 WHERE uid = 1; UPDATE account SET balance = balance + 100 WHERE uid = 2; INSERT INTO transfer_log ...; COMMIT; -- 任一失敗 ROLLBACK
避坑清單:
DELETE FROM t1, t2 ... → ✅ DELETE t1, t2 FROM ...(目標表別名在 DELETE 後)innodb_lock_wait_timeout=5s 速失敗這四大模組,構成了從「寫 SQL」到「治理資料」的核心能力邊界。建議建立個人/團隊「SQL 模式庫」,持續沉澱高頻片段、故障復盤、優化模版,讓經驗可傳承、可複用、可度量。