1. 程式人生 > >Mysql的性能優化

Mysql的性能優化

sql 插入 ignore 速度優化 包括 高性能 sel 形式 導出表

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、type:表示查詢的表。 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索引,查詢出符合條件的。

技術分享圖片

待續......

Mysql的性能優化