MySQL 擁有當之無愧的「極速」聲譽,但多數效能問題源於應用層反模式而非資料庫本身。本文提煉六大鐵律,從資料模型、查詢模式、索引策略、型別選擇、連接管理、觀測體系六個維度,構建高效 MySQL 應用開發標準。
SELECT * FROM orders WHERE user_id=1001; 即使只需訂單號與狀態SELECT order_no, status FROM orders WHERE user_id=1001;db.Orders.Select(o => new {o.OrderNo, o.Status}).ToList()KEY idx_user_status_cover (user_id, status, order_no)EXPLAIN → 驗證 type=ref/range/const、key=預期索引、rows=預期掃描行、Extra=Using index → 不符合 → 改 SQL/加索引/改結構KEY idx_a_b_c (a,b,c) 支援 a / a,b / a,b,cWHERE a=1 AND b>2 AND c=3 索引 (a,c,b) 或 (a,b)WHERE a=1 ORDER BY b → KEY (a,b)WHERE DATE(created_at)=...)、隱式轉換 (WHERE phone=13800000001 phone 為 VARCHAR)TINYINT UNSIGNED (1 byte)TINYINT UNSIGNEDINT UNSIGNED (4 bytes)BIGINT UNSIGNED (8 bytes)DECIMAL(12,2) (6 bytes)TIMESTAMP (4 bytes) / DATETIME (8 bytes)VARCHAR(N) 動態長度| 參數 | 預設 | 建議生產值 | 調優邏輯 |
|---|---|---|---|
| MaxPoolSize | 100 | 200-500 | 峰值併發 * 1.5,避免等待 |
| MinPoolSize | 0 | 10-20 | 預熱連線,冷啟動無延遲 |
| ConnectionLifeTime | 0 (永久) | 300 秒 | 避免 Server 端 wait_timeout 斷開導致殭屍 |
| ConnectionReset | false | true | 從池取出時驗證 ping,淘汰失效連線 |
| DefaultCommandTimeout | 30s | 30-60s | 防止長查詢佔用連線,配合查詢超時熔斷 |
[ ] 是否有 SELECT *?
[ ] WHERE 條件是否有對應複合索引?EXPLAIN 是否 type=ref/range?
[ ] 是否在大表上使用 OFFSET 深分頁?→ 改游標分頁
[ ] 欄位型別是否最小化?有無 INT 存手機號、FLOAT 存金額?
[ ] 連接字串是否配置連接池參數?CharSet=utf8mb4?
[ ] 是否有慢查詢日誌?long_query_time 是否 <= 1?
[ ] 寫入路徑是否批次化?有無單筆 INSERT 迴圈?
[ ] 事務是否過長?有無在事務中呼叫外部 HTTP/RPC?
高效 MySQL 不是調出來的,是設計出來、寫出來、測出來、監控出來的。將六大鐵律內化為團隊肌肉記憶,建立「EXPLAIN 必跑、型別必審、連接池必配、監控必備」的工程文化,才能在業務高速增長期守住資料庫效能底線,避免「重構資料庫」成為專案最大風險。