1. 程式人生 > 其它 >Mysql的效能優化

Mysql的效能優化

Mysql的效能優化

1、參考書籍:MYSQL 5.5從零開始學
  Mysql效能優化就算通過合理安排資源,調整系統引數使MYSQL執行更快,更節省資源。MYSQL效能優化包括查詢速度優化,更新速度優化,mysql伺服器優化等等。此處,介紹以下幾個優化。包含,效能優化的介紹,查詢優化,資料庫結構優化,mysql伺服器優化。
  Mysql優化,一方面是找出系統的瓶頸,提高mysql資料庫整體的效能,另外一個方面需要合理的結構設計和引數調整,以提高使用者操作響應的速度。同時還要儘可能節省系統資源,以便系統可以提供更大負荷的服務。mysql資料庫優化是多方面的,原則是減少系統的瓶頸,減少資源的佔用,增加系統反應的速度。

2、Mysql中,可以使用SHOW STATUS語句查詢一些Mysql資料庫的效能引數。SHOW STATUS語句語法如下所示:
SHOW STATUS LIKE 'value';
其中,value是要查詢的引數值,一些常用的效能引數如下:
a、Connections,連線mysql伺服器的次數。
b、Uptime,mysql伺服器的上線時間。
c、Slow_queries,慢查詢的次數。
d、Com_select,查詢操作的次數。
e、Com_insert,插入操作的次數。
f、Com_update,更新操作的次數。
g、Com_delete,刪除操作的次數。

1 -- 查詢mysql伺服器的連線次數
2 SHOW STATUS LIKE 'Connections';
3 
4 -- 查詢mysql伺服器的慢查詢次數。慢查詢次數引數可以結合慢查詢日誌,找出慢查詢語句,然後針對慢查詢語句進行表結構優化或者查詢語句優化。
5 SHOW STATUS LIKE 'Slow_queries';

3、分析查詢語句。

 1 通過對查詢語句的分析,可以瞭解查詢語句執行的情況,找出查詢語句執行的瓶頸,從而優化查詢語句。mysql中提供了EXPLAIN語句和DESCRIBE語句,用來分析查詢語句。
 2 EXPLAIN語句的基本語法如下:
 3 EXPLAIN [EXTENDED] SELECT select_options;
 4 使用EXTENED關鍵字,EXPLAIN語句將產生附加資訊。select_options是select語句的查詢選項,包括from where子句等等。
 5 執行該語句,可以分析EXPLAIN後面的select語句的執行情況,並且能夠分析出所查詢的表的一些特徵。
 6 例如:EXPLAIN SELECT * FROM user;
 7 
 8 查詢結果進行解釋說明:
 9 a、id:select識別符,這是select的查詢序列號。
10 b、select_type:標識select語句的型別。
11     它可以是以下幾種取值:
12         b1、SIMPLE(simple)表示簡單查詢,其中不包括連線查詢和子查詢。
13         b2、PRIMARY(primary)表示主查詢,或者是最外層的查詢語句。
14         b3、UNION(union)表示連線查詢的第2個或者後面的查詢語句。
15         b4、DEPENDENT UNION(dependent union)連線查詢中的第2個或者後面的select語句。取決於外面的查詢。
16         b5、UNION RESULT(union result)連線查詢的結果。
17         b6、SUBQUERY(subquery)子查詢的第1個select語句。
18         b7、DEPENDENT SUBQUERY(dependent subquery)子查詢的第1個select,取決於外面的查詢。
19         b8、DERIVED(derived)匯出表的SELECT(FROM子句的子查詢)。
20 c、table:表示查詢的表。
21 d、type:表示表的連線型別。
22     下面按照從最佳型別到最差型別的順序給出各種連線型別。
23     d1、system,該表是僅有一行的系統表。這是const連線型別的一個特例。
24     d2、const,資料表最多隻有一個匹配行,它將在查詢開始時被讀取,並在餘下的查詢優化中作為常量對待。const表查詢速度很快,因為它們只讀一次。const用於使用常數值比較primary key或者unique索引的所有部分的場合。
25         例如:EXPLAIN SELECT * FROM user WHERE id=1;
26     d3、eq_ref,對於每個來自前面的表的行組合,從該表中讀取一行。當一個索引的所有部分都在查詢中使用並且索引是UNIQUE或者PRIMARY KEY時候,即可使用這種型別。eq_ref可以用於使用“=”操作符比較帶索引的列。比較值可以為常量或者一個在該表前面所讀取的表的列的表示式。
27         例如:EXPLAIN SELECT * FROM user,db_company WHERE user.company_id = db_company.id;
28     d4、ref對於來自前面的表的任意行組合,將從該表中讀取所有匹配的行。這種型別用於所以既不是UNION也不是primaey key的情況,或者查詢中使用了索引列的左子集,即索引中左邊的部分組合。ref可以用於使用=或者<=>操作符的帶索引的列。
29     d5、ref_or_null,該連線型別如果ref,但是如果添加了mysql可以專門搜尋包含null值的行,在解決子查詢中經常使用該連線型別的優化。
30     d6、index_merge,該連線型別表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
31     d7、unique_subquery,該型別替換了下面形式的in子查詢的ref。是一個索引查詢函式,可以完全替代子查詢,效率更高。
32     d8、index_subquery,該連線型別類似於unique_subquery,可以替換in子查詢,但是隻適合下列形式的子查詢中非唯一索引。
33     d9、range,只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了那個索引。key_len包含所使用索引的最長關鍵元素。當使用=,<>,>,>=,<,<=,is null,<=>,between或者in操作符,用常量比較關鍵字列時,型別為range。
34     d10、index,該連線型別與all相同,除了只掃描索引樹。著通常比all快,引文索引問價通常比資料檔案小。
35     d11、all,對於前面的表的任意行組合,進行完整的表掃描。如果表是第一個沒有標記const的表,這樣不好,並且在其他情況下很差。通常可以增加更多的索引來避免使用all連線。
36 e、possible_keys:possible_keys列指出mysql能使用那個索引在該表中找到行。如果該列是null,則沒有相關的索引。在這種情況下,可以通過檢查where子句看它是否引起某些列或者適合索引的列來提高查詢效能。如果是這樣,可以建立適合的索引來提高查詢的效能。
37 f、key:表示查詢實際使用到的索引,如果沒有選擇索引,該列的值是null,要想強制mysql使用或者忽視possible_key列中的索引,在查詢中使用force index、use index或者ignore index。
38 g、key_len:表示mysql選擇索引欄位按照位元組計算的長度,如果健是null,則長度為null。注意通過key_len值可以確定mysql將實際使用一個多列索引中的幾個欄位。
39 h、ref:表示使用那個列或者常數或者索引一起來查詢記錄。
40 i、rows:顯示mysql在表中進行查詢必須檢查的行數。
41 j、Extra:該列mysql在處理查詢時的詳細資訊。

4、DESCRIBE語句的使用方法與EXPLAIN語句是一樣的,並且分析結果也是一樣的。DESCRIBE語句的語法形式如下所示:DESCRIBE SELECT select_options。DESCRIBE可以縮寫成DESC。

5、索引對查詢速度的影響。

1 mysql中提高效能的最有效的方式就是對資料表設計合理的索引。索引提供了高效訪問資料的方法,並且加快了查詢的速度。因此,索引對查詢的速度有著至關重要的影響。使用所以可以快速的定位到表中的某條記錄,從而提高資料庫查詢的速度,提高資料庫的效能。如果查詢的時候沒有使用索引,查詢語句將掃描表中的所有記錄。在資料量大的情況下,這樣查詢的速度會很慢。如果使用索引進行查詢,查詢語句可以根據索引快速定位到待查詢的記錄,從而減少查詢的記錄數,達到提高查詢速度的目的。

舉例說明,使用索引和不使用索引的區別:

不使用索引rows列的值是26,說明此查詢語句掃描了26條記錄。

使用索引rows列的值是1,說明此查詢語句掃描了1條記錄。查詢速度自然變快了。這種方法也可以判斷自己新增的所以是否起了作用。

6、使用索引查詢,幾種特殊情況。

  索引可以提高查詢的速度,但並不是使用帶有索引的欄位查詢時,索引都會起到作用。下面是幾種比較特殊的情況。在這些情況下,有可能使用帶有索引的欄位查詢時,索引並沒有起到作用。

6.1、使用like關鍵字的查詢語句。在使用like關鍵字進行查詢的查詢語句中,如果匹配字串的第一個字元為"%",索引不會起作用。只有"%"不在第一個位置,索引才會起到作用。

使用模糊查詢,”%“在前面的結果,顯示索引沒有起了作用了的。

使用模糊查詢,”%“在後面的結果,顯示索引起了作用了的。

6.2、使用多列索引的查詢語句。mysql可以為多個欄位建立索引。一個索引可以包括16個欄位。對於多列索引,只有查詢條件中使用了這些欄位中第1個欄位的時候,索引才會被使用。

多列所有的第一個欄位作為查詢條件的時候,發現索引起了作用了的:

6.3、使用or關鍵字的查詢語句。使用語句的查詢條件中只有or關鍵字,且or前後的兩個條件中的列都有索引時,查詢中才使用索引。否則,查詢將不適用索引。

使用name索引,sex索引,查詢出符合條件的。