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
轉載于:https://www.cnblogs.com/qixidi/p/10202488.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的mysql性能优化的一些建议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部队旧房子如何处理
- 下一篇: 美日联合军演之际,辽宁舰冲出第一岛链