首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Monty 談 MySQL 優化(六):查詢執行計劃分析、優勢場景、避免陷阱與鎖定機制

     編輯:MySQL 資料庫相關知識

二十六、如何理解 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: 強制使用/忽略指定索引
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved