1. 程式人生 > >Monty說MySQL的優化(五)(

Monty說MySQL的優化(五)(

本文是Monty在O'Reilly Open Source Convention 2000大會上的演講之五,涉及MySQL表快取記憶體工作原理、MySQL擴充套件/優化-提供更快的速度、MySQL何時使用索引、學會使用 EXPLAIN、使用SHOW PROCESSLIST五個方面,是篇詳盡的MySQL優化文件

二十一、MySQL表快取記憶體工作原理

每個MyISAM表的開啟例項(instance)使用一個索引檔案和一個數據檔案。如果表被兩個執行緒使用或在同一條查詢中使用兩次,MyIASM將共享索引檔案而是開啟資料檔案的另一個例項。
如果所有在快取記憶體中的表都在使用,快取將臨時增加到比表快取尺寸大些。如果是這樣,下一個被釋放的表將被關閉。
你可以通過檢查mysqld的Opened_tables變數以檢查表快取是否太小。如果該值太高,你應該增大表快取記憶體。
 
二十二、MySQL擴充套件/優化-提供更快的速度



使用優化的表型別(HEAP、MyIASM或BDB表)。
對資料使用優化的列。
如果可能使用定長行。
使用不同的鎖定型別(SELECT HIGH_PRIORITY,INSERT LOW_PRIORITY)
Auto_increment
REPLACE (REPLACE INTO table_name VALUES (...))
INSERT DELAYED
LOAD DATA INFILE / LOAD_FILE()
使用多行INSERT一次插入多行。
SELECT INTO OUTFILE
LEFT JOIN, STRAIGHT JOIN
LEFT JOIN ,結合IS NULL
ORDER BY可在某些情況下使用鍵碼。
如果只查詢在一個索引中的列,將只使用索引樹解決查詢。
聯結一般比子查詢快(對大多數SQL伺服器亦如此)。
LIMIT
SELECT * from table1 WHERE a > 10 LIMIT 10,20
DELETE * from table1 WHERE a > 10 LIMIT 10
foo IN (常數列表) 高度優化。
GET_LOCK()/RELEASE_LOCK()
LOCK TABLES
INSERT和SELECT可同時執行。
UDF函式可裝載進一個正在執行的伺服器。
壓縮只讀表。
CREATE TEMPORARY TABLE
CREATE TABLE .. SELECT
帶RAID選項的MyIASM表將檔案分割成很多檔案以突破某些檔案系統的2G限制。
Delay_keys
複製功能

二十二、MySQL何時使用索引


對一個鍵碼使用>, >=, =, 1 and key_part1 < 90
如果使用HEAP表且不用=搜尋所有鍵碼部分。
在HEAP表上使用ORDER BY。
如果不是用鍵碼第一部分

SELECT * FROM table_name WHERE key_part2=1
如果使用以一個萬用字元開始的LIKE

SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'
搜尋一個索引而在另一個索引上做ORDER BY

SELECT * from table_name WHERE key_part1 = # ORDER BY key2

二十四、學會使用EXPLAIN


對於每一條你認為太慢的查詢使用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 | |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
ALL和範圍型別提示一個潛在的問題。
 
二十五、學會使用SHOW PROCESSLIST

使用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 |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
在mysql或mysqladmin中用KILL來殺死溜掉的執行緒