二十六、如何理解 MySQL 解決查詢
執行並分析以下命令輸出:
SHOW VARIABLES;
SHOW COLUMNS FROM ...\G
EXPLAIN SELECT ...\G
FLUSH STATUS;
SELECT ...;
SHOW STATUS;
二十七、MySQL 表現優異的場景
- 大量連線時連線極快
- 同時大量 SELECT 和 INSERT
- 不將更新與耗時長的 SELECT 結合
- 大多數選擇/更新使用唯一鍵值
- 使用無長時間衝突鎖定的多表
- 大表場景(MySQL 採用極緊湊表格式)
二十八、MySQL 應避免的操作
- 在有刪除行的表上更新/插入,結合耗時長的 SELECT
- 在能放入 WHERE 的列上用 HAVING
- 不使用鍵值或鍵值不夠唯一進行 JOIN
- 不同列類型的列上 JOIN
- HEAP 表上不使用
= 匹配整個鍵值
- 監控程式中忘記 UPDATE/DELETE 的 WHERE 子句(用
--i-am-a-dummy 選項防護)
二十九、MySQL 各類鎖定機制
內部表鎖定
LOCK TABLES(所有表類型適用)
GET_LOCK()/RELEASE_LOCK()
頁面鎖定(BDB 表)
ALTER TABLE 也會在 BDB 表上進行表鎖定
鎖定優先級
LOCK TABLES 允許一表多讀者單寫者。寫入鎖定優先級高於讀取鎖定以防寫入飢餓。非關鍵寫入可用 LOW_PRIORITY 讓鎖管理器優先服務讀取者:
UPDATE LOW_PRIORITY SET value=10 WHERE id=10;
三十、給優化器更多提示的技巧
註釋語法保持可移植性:SELECT /*! SQL_BUFFER_RESULT */ ... 或 SELECT SQL_BUFFER_RESULT ...
- SQL_BUFFER_RESULT: 強制生成臨時結果集,生成後釋放所有表鎖,緩解表鎖爭用或長時間傳輸結果
- SQL_SMALL_RESULT: 告知優化器結果集極小
- SQL_BIG_RESULT: 告知優化器結果集極大
- STRAIGHT_JOIN: 強制按 FROM 子句順序聯結表
- USE INDEX / IGNORE INDEX: 強制使用/忽略指定索引