會寫 CRUD 不代表精通資料庫。本文精選四個能直觀體現工程師經驗深淺的實戰技巧:進程診斷、資料一致性驗證、索引哲學、複雜聯表操作,附帶真實故障案例與最佳實踐,助你從「能跑通」進階到「懂原理、會調優、敢負責」。
SHOW [FULL] PROCESSLIST; -- 關鍵欄位:Id, User, Host, db, Command, Time, State, Info
核心狀態解碼與應對策略:
| State | 含義 | 典型成因 | 應對動作 |
|---|---|---|---|
| Sleep | 連線閒置待命 | 連線池洩漏、未釋放連線、長事務 | 檢查應用 close()、縮短 wait_timeout、kill 閒置進程 |
| Waiting for net / Reading/Writing to net | 網路 I/O 等待 | 結果集過大、頻寬飽和、跨機房延遲 | 優化查詢縮小結果集、啟用壓縮、就近部署 |
| Locked | 表級鎖等待 | MyISAM 長查詢阻塞寫入、DDL 操作 | 遷移 InnoDB 行鎖、拆分大查詢、維護窗口執行 DDL |
| Copy to tmp table | 建立臨時表 | 索引缺失導致無法覆蓋、複雜 JOIN/ORDER BY/GROUP BY | 補齊索引、拆分查詢、調大 tmp_table_size/max_heap_table_size |
| Sending data | 讀取行並發送 | 掃描行數過多、隨機 I/O、結果集大 | 優化索引、分頁優化、覆蓋索引、縮小選擇列 |
| Sorting for group/order | 排序操作 | 排序列無索引、排序緩衝不足 | 建立符合順序的複合索引、增大 sort_buffer_size |
| Storing result to query cache | 寫入查詢快取 | 快取碎片化、鎖競爭 | FLUSH QUERY CACHE、調優 query_cache_size、或直接關閉 |
實戰案例:某社區站點資料庫阻塞,show processlist 發現某冷門小站產生海量 Copy to tmp table,佔滿磁碟 I/O 導致全站雪崩。KILL 該進程瞬間恢復。教訓:定期巡檢長時間運行進程,建立自動化慢查詢/阻塞告警。
LOAD DATA [LOCAL] INFILE 'path/file.csv' INTO TABLE t FIELDS TERMINATED BY ',';FILE 權限;LOCAL 關鍵字決定讀取端(客戶端 vs 伺服端)pt-index-usage 分析未用索引,pt-duplicate-key-checker 檢測冗餘索引-- 多表更新(別名必加) UPDATE t1 LEFT JOIN t2 ON t1.uid = t2.uid SET t1.name = t2.name, t1.desc = 'xxx' WHERE t1.date = '2023-10-11'; -- 多表刪除(指定刪除目標表別名) 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; -- 業務 SQL 序列 COMMIT; -- 或 ROLLBACK;
避坑指南:
FROM 後明確列出目標表別名is_deleted=1innodb_lock_wait_timeout、lock_wait_timeout 雙重保護這四項技能,是區分「寫 SQL」與「治理資料」的分水嶺。建議建立個人「SQL 模式庫」,沉澱高頻片段與避坑案例,持續迭代。