本文是Monty在O'Reilly Open Source Convention 2000大會上的演講之六,涉及MySQL解決一條查詢、MySQL非常不錯、MySQL應避免的事情 、MySQL各種鎖定、MySQL更多信息五個方面,是篇詳盡的MySQL優化文
二十六、如何知曉MySQL解決一條查詢
運行項列命令並試圖弄明白其輸出:
SHOW VARIABLES;
SHOW COLUMNS FROM ...G
EXPLAIN SELECT ...G
FLUSH STATUS;
SELECT ...;
SHOW STATUS;
二十七、MySQL非常不錯
日志
在進行很多連接時,連接非常快。
同時使用SELECT和INSERT的場合。
在不把更新與耗時太長的選擇結合時。
在大多數選擇/更新使用唯一鍵碼時。
在使用沒有長時間沖突鎖定的多個表時。
在用大表時(MySQL使用一個非常緊湊的表格式)。
二十八、MySQL應避免的事情
用刪掉的行更新或插入表,結合要耗時長的SELECT。
在能放在WHERE子句中的列上用HAVING。
不使用鍵碼或鍵碼不夠唯一而進行JOIN。
在不同列類型的列上JOIN。
在不使用=匹配整個鍵碼時使用HEAP表。
在MySQL監控程序中忘記在UPDATE或DELETE中使用一條WHERE子句。如果想這樣做,使用mysql客戶程序的--i-am-a-dummy選項。
二十九、MySQL各種鎖定
內部表鎖定
LOCK TABLES(所有表類型適用)
GET LOCK()/RELEASE LOCK()
頁面鎖定(對BDB表)
ALTER TABLE也在BDB表上進行表鎖定
LOCK TABLES允許一個表有多個讀者和一個寫者。
一般WHERE鎖定具有比READ鎖定高的優先級以避免讓寫入方干等。對於不重要的寫入方,可以使用LOW_PRIORITY關鍵字讓鎖定處理器優選讀取方。
UPDATE LOW_PRIORITY SET value=10 WHERE id=10;
三十、給MySQL更多信息以更好地解決問題的技巧 注意你總能去掉(加注釋)MySQL功能以使查詢可移植:
SELECT /*! SQL_BUFFER_RESULTS */ ...
SELECT SQL_BUFFER_RESULTS ...
將強制MySQL生成一個臨時結果集。只要所有臨時結果集生成後,所有表上的鎖定均被釋放。這能在遇到表鎖定問題時或要花很長時間將結果傳給客戶端時有所幫助。
SELECT SQL_SMALL_RESULT ... GROUP BY ...
告訴優化器結果集將只包含很少的行。
SELECT SQL_BIG_RESULT ... GROUP BY ...
告訴優化器結果集將包含很多行。
SELECT STRAIGHT_JOIN ...
強制優化器以出現在FROM子句中的次序聯結表。
SELECT ... FROM table_name [USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2
強制MySQL使用/忽略列出的索引。