1. 程式人生 > >mysql效能優化的一些建議

mysql效能優化的一些建議

mysql效能優化的一些建議

1、EXPLAIN 你的 SELECT 查詢
檢視rows列可以讓我們找到潛在的效能問題。

2、為關鍵欄位新增索引,比如:where, order by, group by等後面的欄位
注意:like '%abc%'; 是不會用到索引的
只有 like 'abc%' 才會用到索引

3、當只要一行資料時使用 LIMIT 1
MySQL資料庫引擎會在找到一條資料後停止搜尋

4、關於join
join是將兩張表拼在一起形成一個臨時大表的操作,然後在大表裡查詢記錄的;因此,資料量大的話非常慢,記錄表不要join。
而且,這些被用來Join的欄位,應該是相同的型別的。例如:如果你要把 DECIMAL 欄位和一個 INT 欄位Join在一起,MySQL就無法使用它們的索引。

5、避免 SELECT *
從資料庫裡讀出越多的資料,那麼查詢就會變得越慢。並且,如果你的資料庫伺服器和WEB伺服器是兩臺獨立的伺服器的話,這還會增加網路傳輸的負載。
所以,你應該養成一個需要什麼就取什麼的好的習慣。

6、永遠為每張表設定一個ID
我們應該為資料庫裡的每張表都設定一個ID做為其主鍵,而且最好的是一個INT型的(推薦使用UNSIGNED),並設定上自動增加的AUTO_INCREMENT標誌。

7、不要用VARCHAR 型別來當主鍵

8、使用 ENUM 而不是 VARCHAR
ENUM 型別是非常快和緊湊的。在實際上,其儲存的是 TINYINT,但其外表上顯示為字串。這樣一來,用這個欄位來做一些選項列表變得相當的完美。
如果你有一個欄位,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些欄位的取值是有限而且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。

9、儘可能的使用 NOT NULL 定義欄位
應該指定列為NOT NULL,除非你想儲存NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值。

10、固定長度的表會更快
如果表中的所有欄位都是“固定長度”的,整個表會被認為是 “static” 或 “fixed-length”。 例如,表中沒有如下型別的欄位: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些欄位,那麼這個表就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。
固定長度的表會提高效能,因為MySQL搜尋得會更快一些,因為這些固定的長度是很容易計算下一個資料的偏移量的,所以讀取的自然也會很快。而如果欄位不是定長的,那麼,每一次要找下一條的話,需要程式找到主鍵。

11、欄位較多的表,使用垂直分割
比如使用者表,經常用到的欄位一個表,使用者屬性分到另一個表

12、DELETE 或 INSERT 語句會鎖表
一個大的 DELETE 或 INSERT 查詢,你需要非常小心,要避免你的操作讓你的整個網站停止相應。
while (1) {
mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");
if (mysql_affected_rows() == 0) {
break;
}
usleep(50000);
}

13、關於索引
1、mysql一次查詢只能使用一個索引。如果要對多個欄位使用索引,建立複合索引。
2、在ORDER BY操作中,MySQL只有在排序條件不是一個查詢條件表示式的情況下才使用索引。
3、MySQL索引通常是被用於WHERE,ORDER BY,GROUP BY
4、ORDER BY的索引優化:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];
在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。
5、WHERE + ORDER BY的索引優化:
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];
此sql的索引將被應用在[columnX]上,雖然[sort]有索引但是用不上,需要建立聯合索引才能使order by使用索引
create index index_name(columnX,sort);
注意:如果columnX對應多個值,如下面語句就無法利用索引來實現order by的優化
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];
6、WHERE + ORDER BY 多個欄位
SELECT * FROM [table] WHERE uid=1 ORDER by x,y LIMIT 0,10;
create index index_name(uid,x,y); 注意順序,index_name(uid,x,y)支援三種索引:uid, uid+x, uid+x+y