MySQL性能優化速記

總結自《MySQL 5.7從入門到精通(視頻教學版)》劉增傑編著。

優化簡介

MySQL數據庫優化是多方面的,原則是減少系統的瓶頸,減少資源的佔用,增加系統的反應速度。
在MySQL中,可以通過SHOW STATUS 語句查詢一些MySQL的性能參數。如查詢連接次數,可以執行如下語句:
SHOW STATUS LIKE 'Connections';
如果要查詢慢查詢次數,可以執行如下語句:
SHOW STATUS LIKE 'Slow_queries';
一些常用的性能參數如下:
- Connections:連接MySQL服務器的次數;
- Uptime:MySQL服務器的上線時間;
- Slow_queries:慢查詢的次數;
- Com_select:查詢操作的次數(select可以換insertupdatedelete,分別查詢插入、更新、刪除的次數)。

MySQL數據庫優化可以從三方面考慮,分別是優化查詢、優化數據庫結構、優化MySQL數據庫。

優化查詢

  1. 分析查詢語句。
  2. 利用索引來加快查詢速度。
  3. 優化子查詢。

分析查詢語句

通過對查詢語句的分析,可以瞭解查詢語句的執行情況。MySQL中提供了EXPLAINDESCRIBE 來分析查詢語句。
示例如下:
EXPLAIN SELECT * FROM `user` WHERE username = 'admin';
結果如圖示:

幾個參數說明一下:
- id:SELECT識別 符。這是SELECT的查詢序列號。
- select_type:表示SELECT語句的類型。
- table:表示查詢的表。
- type:表示表的連接類型。ALL表示 進行了全表掃描。這是最壞的結果。
- possible_keys:指出MySQL能使用哪個索引在該表中找到行。如果爲NULL,表示沒有相關索引。
- key:表示查詢實際使用到的索引。
- key_len:表示MySQL選擇的索引字段按字節計算的長度。
- ref:表示使用哪個列或常數與索引一起來查詢記錄。
- rows:顯示MySQL在表中進行查詢時必須檢查的行數。
- Extra:表示MySQL在處理查詢時的詳細信息。

利用索引來加快查詢速度

MySQL中提高性能的一個最有效的方式就是對數據表設計合理的索引。索引提供了高效的查詢數據的方法,並且加快了查詢速度。如分析查詢語句中,顯示的type爲ALL 就是表示進行了全表掃描,沒有使用索引的情況。對username 添加一個名爲username_index 普通索引,再來分析查詢語句,結果如圖示:

可以看到,type類型變爲ref,這表示從表中讀取所有匹配的行,用於索引既不是UNIQUE也不是PRIMARY KEY 的情況,或者查詢中使用了索引列的左子集,即索引中左邊的部分列組合。

使用索引有幾種特殊情況,在這些情況下,有可能使用帶有索引的字段查詢時,索引並沒有起效,下面介紹一下這幾種特殊的情況。

  1. 使用LIKE關鍵字的查詢語句
    在使用LIKE關鍵字進行查詢的語句中,如果匹配字符串的第一個字符爲“%”,索引不會起作用。只有“%”不在第一個位置,索引纔會起作用。
  2. 使用多列索引的查詢語句
    MySQL可以爲多個字段創建索引。一個索引可以包括16個字段。對於多列索引,只有查詢條件中使用了這些字段中的第一個字段時,索引纔會起作用。
  3. 使用OR關鍵字的查詢語句
    查詢語句的查詢條件中只有OR關鍵字,且OR前後的兩個條件中的列都是索引時,查詢中才使用索引。否則,查詢將不使用索引。

優化子查詢

子查詢可以一次性完成很多邏輯上需要多個步驟才能完成的SQL操作。子查詢雖然可以使查詢語句很靈活,但是執行效率不高。執行子查詢時,MySQL需要爲內層查詢語句的查詢結果建立一個臨時表。然後外層查詢語句從臨時表中查詢記錄。查詢完畢後,再撤銷這些臨時表。因此,子查詢的速度會受到一定的影響。
在MySQL中,可以使用連接(JOIN)查詢來替代子查詢。連接查詢不需要建立臨時表,其速度比子查詢要快。

優化數據庫結構

合理的數據庫結構不僅可以使數據庫佔用更小的磁盤空間,而且能夠使查詢速度更快。數據庫結構的設計,需要考慮數據冗餘、查詢和更新的速度、字段的數據類型是否合理等多方面的內容。

將字段很多的表分解成多個表

對於字段很多的表,如果有些字段的使用頻率很低,可以將這些字段分離出來形成新表。因爲當一個表的數據量很大時,會由於使用頻率低的字段存在而變慢。

增加中間表

對於需要經常聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的數據插入到中間表中,然後將原來的聯合查詢改爲對中間表的查詢,以此來提高查詢效率。

增加冗餘字段

設計數據庫表時應儘量遵循範式理論的規約,儘可能減少冗餘字段,讓數據庫設計看起來精緻、優雅。但是,合理地加入冗餘字段可以提高查詢速度。

優化插入記錄的速度

插入記錄時,影響插入速度的主要是索引、唯一性校驗、一次插入記錄條數等。可以分別對此進行針對性優化。

分析表、檢查表和優化表

MySQL提供了分析表、檢查表和優化表的語句。分析表主要是分析關鍵字的分佈;檢查表主要是檢查表是否存在錯誤;優化表主要是消除刪除或者更新造成的空間浪費。

  1. 分析表:ANALYZE TABLE 表名;
  2. 檢查表:CHECK TABLE 表名;
  3. 優化表:OPTIMIZE TABLE 表名;(只能優化表中的VARCHAR、BLOB或TEXT類型的字段)

上述的這三個方法,數據庫系統都會自動對錶加一個只讀鎖。在分析表期間,只能讀取表中的記錄,不能更新和插入記錄。在多數場景下,不需要使用優化表,即使對可變長度的行進行了大量的更新,也不需要經常運行,每週一次或每月一次即可,並且只需要對特定的表運行。

優化MySQL服務器

優化服務器硬件

服務器的硬件性能直接決定着MySQL數據庫的性能。硬件的性能瓶頸,也決定了數據庫的運行速度和效率。一般常用的優化服務器硬件的方法如下:
1. 配置較大的內存。
2. 配置高速磁盤系統,以減少讀盤的等待時間,提高響應速度。
3. 合理分佈磁盤I/O,把磁盤I/O分散在多個設備上,以減少資源競爭,提高並行操作能力。
4. 配置多處理器,MySQL是多線程的數據庫,多處理器可同時執行多個線程。

優化MySQL的參數

通過優化MySQL的參數可以提高資源利用率,從而達到提高MySQL服務器性能的目的。
MySQL服務的配置參數都在my.cnf或者my.ini文件的[MySQLd]組中。其中:

  • key_buffer_size:表示索引緩衝區的大小。索引緩衝區所有的線程共享。合理的緩衝區大小可以更好處理索引。

  • table_cache:表示同時打開表的個數。

  • query_cache_size:表示查詢緩衝區的大小。

  • innodb_buffer_pool_size:表示InnoDB類型的表和索引的最大緩存。值越大,查詢的速度就會越快。

  • max_connections:表示最大連接數,該值不是越大越好,過多的連接數可能會導致MySQL服務器僵死。
    ……其它略。

補充

1.索引是不是越多越好?
合理的索引可以提高查詢速度,但是索引也不是越多越好。在執行插入語句前,MySQL要爲新插入的記錄建立索引,所以過多的索引會導致插入操作變慢。
2. 如何使用查詢緩衝區?
查詢緩衝區可以提高查詢速度,但是隻適合查詢語句比較多、更新語句比較少的情況,具體方式參照優化MySQL參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章