首頁 > 軟體

為什麼MySQL查詢速度會慢

2022-12-03 14:01:51

一、先了解一下MySQL查詢的執行過程

MySQL在查詢時,它是由很多子任務組成的,每個子任務都會消耗一定的時間,如果要想優化查詢,實際上要優化其子任務,可以消除一些子任務、減少子任務的執行次數、讓子任務執行的更快。

MySQL查詢的執行過程:從使用者端到伺服器、然後在伺服器進行解析、生成執行計劃、執行、返回結果給使用者端。

執行是最重要的階段,包括呼叫儲存引擎檢索資料、呼叫後的資料處理、排序、分組等;

查詢需要在不同的地方花費時間,包括網路、CPU計算、生成統計資訊、生成執行計劃、鎖等待等,尤其是向底層儲存引擎檢索資料的呼叫操作,這些呼叫需要在記憶體操作、CPU操作和記憶體不足時導致的IO操作上花費時間。根據儲存引擎不同,可能還會產生大量的上下文切換以及系統呼叫。

不必要的額外操作、不必要的重複操作、某些操作執行的太慢都是查詢慢的原因,優化查詢的目的就是減少和消除這些操作所花費的時間。

二、是否查詢了不需要的資料

有些查詢會查詢很多不需要的資料,查詢之後,程式中並未使用,這樣不但會給MySQL伺服器帶來額外的負擔,還會增加網路開銷,也會消耗應用伺服器的CPU和記憶體資源,簡而言之,吃多少拿多少。

千萬不要有“把資料都查出來,用Java程式碼過濾”的想法。

禁止使用select *進行查詢。

三、衡量查詢開銷的幾個重要指標

1、響應時間

響應時間可以分為服務時間和排序時間。

  • 服務時間指資料庫處理這個查詢真正花費的時間;
  • 排隊時間指伺服器因為等待某些資源而沒有真正執行查詢的時間,比如等待IO操作、等待行鎖。

2、掃描的行數和返回的行數

較短的行的存取速度更快,記憶體中的行比磁碟中的行的存取速度要快得多。

理想情況下掃描的行數和返回的行數是相同的。但這種情況並不多見,比如關聯查詢的時候,伺服器必須掃描更多的行才能得到結果,因此,越多的表關聯,效能越低。

3、掃描的行數和存取型別

MySQL可以通過多種方式查詢並返回結果集,速度從慢到快,掃描的行數由多到少,依次為全表掃描、索引掃描、範圍掃描、唯一索引掃描、常數參照。

最常用的優化方式是為查詢增加一個合適的索引,索引可以讓MySQL以最高效、掃描行數最少的方式找到需要的記錄。

4、一般可以通過explain的Extra列檢視查詢的優劣

一般MySQL能夠使用以下三種方式應用where條件,從好到壞依次為:

  • 在索引中使用where條件過濾不匹配的記錄,這是在儲存引擎層完成的;
  • 使用索引覆蓋掃描,也就是Extra中出現Using index,直接從索引中過濾不需要的記錄並返回命中的結果,這是在MySQL伺服器層完成的,無須再回表查詢記錄;
  • Extra中出現Using where,這是在MySQL伺服器層完成的,MySQL需要先從資料表讀取記錄,然後過濾。

Extra中出現Using where時,可以通過如下方式優化:

  • 使用索引覆蓋掃描,把所有需要的列都放到索引中,這樣就不用回表查詢了;
  • 改變表結構,比如使用匯總表;
  • 重寫sql,讓MySQL優化器能夠以更優化的方式執行這個sql;

到此這篇關於為什麼MySQL查詢速度會慢的文章就介紹到這了,更多相關MySQL查詢速度慢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com