本文整理自 Monty 在 O'Reilly Open Source Convention 2000 大會演講第六部分,涵蓋查詢解析診斷流程、MySQL 適用與不適用場景、鎖機制詳解、以及給予優化器提示的進階語法。
依序執行以下指令並分析輸出:
SHOW VARIABLES;
SHOW COLUMNS FROM ...\G
EXPLAIN SELECT ...\G
FLUSH STATUS;
SELECT ...;
SHOW STATUS;
HAVING 用於可下推 WHERE 的欄位= 比對UPDATE/DELETE 加 WHERE(可用 --i-am-a-dummy 強制要求)| 鎖類型 | 適用範圍 | 特性 |
|---|---|---|
| 內部表鎖 | 所有引擎 | MyISAM 預設 |
LOCK TABLES | 所有表類型 | 允許多讀單寫 |
GET_LOCK()/RELEASE_LOCK() | 應用層 | 建議性鎖,需應用協作 |
| 頁面鎖 | BDB 表 | 粒度介於表鎖與行鎖間 |
| 行鎖 | InnoDB | 自動行級鎖定,支援事務隔離 |
鎖優先級機制:寫鎖優先於讀鎖(防止寫入飢餓)。非關鍵寫入可用 LOW_PRIORITY 降級:
UPDATE LOW_PRIORITY SET value=10 WHERE id=10;
以註釋形式包裹,保持標準 SQL 可移植性:
| 語法 | 效果 |
|---|---|
SELECT /*! SQL_BUFFER_RESULT */ ... | 強制產生臨時結果集,釋放表鎖 |
SELECT SQL_SMALL_RESULT ... GROUP BY ... | 告知優化器結果集極小 |
SELECT SQL_BIG_RESULT ... GROUP BY ... | 告知優化器結果集巨大 |
SELECT STRAIGHT_JOIN ... | 強制按 FROM 子句順序聯結 |
SELECT ... FROM t USE INDEX (idx) ... | 強制使用指定索引 |
SELECT ... FROM t IGNORE INDEX (idx) ... | 強制忽略指定索引 |
實戰建議:遇到表鎖爭用嚴重、或結果集傳輸耗時過長時,SQL_BUFFER_RESULT 能有效釋放鎖資源。