本文整理自 Monty 在 O'Reilly Open Source Convention 2000 大會演講第五部分,聚焦表快取機制、MySQL 獨有擴展優化、索引使用條件、EXPLAIN 執行計劃分析與 SHOW PROCESSLIST 監控實戰。
SHOW STATUS LIKE 'Opened_tables' 數值過高暗示 table_cache 偏小,需調大SELECT HIGH_PRIORITY、INSERT LOW_PRIORITYAUTO_INCREMENT、REPLACE INTO、INSERT DELAYED、LOAD DATA INFILESELECT INTO OUTFILE 導出LEFT JOIN、STRAIGHT_JOIN、LEFT JOIN ... IS NULL 模式ORDER BY 特定情況可用索引LIMIT 限制結果集:LIMIT 10,20、DELETE ... LIMIT 10col IN (常數列表) 高度優化GET_LOCK()/RELEASE_LOCK() 應用層鎖LOCK TABLES 表鎖CREATE TEMPORARY TABLE、CREATE TABLE ... SELECTDELAY_KEY_WRITE、複寫功能>、>=、=、<、<=、<>、IN()、BETWEEN 且作用於索引前綴LIKE 'prefix%'(非萬用字元開頭)= 比對所有鍵部分ORDER BY 索引欄位WHERE key_part2 = 1LIKE '%pattern%' 以萬用字元開頭WHERE key_part1 = 1 ORDER BY key2原則:凡覺得查詢緩慢,必跑 EXPLAIN。
mysql> EXPLAIN SELECT t3.DateOfAction, t1.TransactionID
-> FROM t1 JOIN t2 JOIN t3
-> WHERE t2.ID = t1.TransactionID AND t3.ID = t2.GroupID
-> ORDER BY t3.DateOfAction, t1.TransactionID;
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort |
| t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | |
| t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
關鍵判讀:type=ALL(全表掃描)與 type=range 為潛在效能問題信號;Extra 欄出現 Using temporary、Using filesort 需優化。
mysql> SHOW PROCESSLIST;
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
| 6 | monty | localhost | bp | Query | 15 | Sending data | select * from station,station as s1 |
| 8 | monty | localhost | | Query | 0 | | show processlist |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
發現長時間運行或異常查詢,可用 KILL <Id> 終止(在 mysql 或 mysqladmin 中均可)。