MySQL查詢效能優化

2021-09-10 06:22:40 字數 1740 閱讀 7900

重構查詢方式

查詢執行

優化 limit 分頁

參考資料

最有效的方式是使用索引來覆蓋查詢。

乙個大查詢如果一次性執行的話,可能一次鎖住很多資料、佔滿整個事務日誌、耗盡系統資源、阻塞很多小的但重要的查詢。因此可以將大查詢切分成小查詢,每個查詢功能完全一樣,只完成一小部分,每次只返回一小部分查詢結果。

可以對每乙個表進行一次單錶查詢,然後將結果在應用程式中進行關聯。這麼做有如下優勢:

客戶端傳送一條查詢給伺服器。

伺服器先檢查查詢快取,如果命中了快取,則立刻返回儲存在快取中的結果。否則進入下一階段。

伺服器端進行sql解析、預處理再由優化器生成對應的執行計畫。

mysql根據優化器生成的執行計畫,呼叫儲存引擎的api來執行查詢。

將結果返回給客戶端。

mysql解析器將使用mysql語法規則驗證和解析查詢;預處理器則根據一些mysql規則進一步檢查解析樹是否合法,例如檢查資料表和資料列是否存在,之後會驗證許可權;查詢優化器的作用是根據儲存引擎提供的統計資訊找出乙個最優的執行計畫。

在偏移量特別大的時候,例如可能是limit 1000, 20這樣的查詢,這時mysql需要查詢10020條記錄然後只返回最後20條,前面10000條記錄都將被拋棄,這樣的代價非常高。可以通過延遲關聯和書籤兩個技巧進行優化。

優化此類分頁查詢的乙個最簡單的辦法就是盡可能地使用索引覆蓋掃瞄,而不是查詢所有的列。然後根據需要做一次關聯操作再返回所需的列。考慮下面的查詢:

select film_id, description from sakila.film order

by title limit50,

5;

此時沒有覆蓋索引,因此要回表獲取記錄55條,而只返回最後5條1。這時候可以用延遲關聯的技巧改寫成如下:

select film.film_id, film.description

from sakila.film

inner

join

(select film_id from sakala.film

order

by title limit50,

5)as lim using

(film_id)

;

這時候子查詢中能使用覆蓋索引,因此在索引結構中就能獲取到需要訪問的記錄而無需回表,之後再根據關聯列回表查詢需要的所有列。

limitoffset的問題,其實是offset的問題,它會導致mysql掃瞄大量不需要的行然後再拋棄掉。如果可以使用書籤記錄上次取資料的位置,那麼下次就可以直接從該書籤記錄的位置開始掃瞄,這樣就可以避免使用offset。例如,若需要按照租借記錄做翻頁,那麼可以根據最新一條租借記錄向後追溯,首先使用下面的查詢獲得第一組結果:

select

*from sakila.rental

order

by rental_id desc

limit

20;

select

*from sakila.rental

where rental_id <

30order

by rental_id desc

limit

20;

該技術的好處是無論翻頁到多麼後面,其效能都會很好。

mysql查詢效能優化 MySQL 查詢效能優化

在日常開發中,程式設計師寫的最多的除了bug之外,應該算是sql語句了。sql的質量影響了程式的響應速度,只有利用mysql的特性,才能讓mysql更有效的執行查詢sql,充分發揮mysql的優勢,並避開它的弱點。為什麼查詢速度會慢?在編寫sql之前,需要清楚一點 真正重要的是響應時間。如果我們把查...

mysql 查詢效能優化

mysql 執行查詢,客戶端向 mysql 傳送請求的時候,mysql 伺服器執行一系列過程,保證查詢語句在 mysql 中得到最高效能的效率。客戶端傳送一條查詢給伺服器 2 伺服器先檢查查詢快取,如果命中了快取,則返回儲存在快取中的結果。否則,進入下乙個階段。3 伺服器進行 sql解析 預處理,再...

mysql查詢效能優化

mysql執行查詢的過程 如圖 1 客戶端首先通過客戶端 伺服器通訊協議與mysql伺服器建立起連線 2 客戶端傳送一條sql語句 判斷是否為查詢語句,如果是查詢語句,則先在查詢快取區雜湊查詢對應sql的資料,如果未找到,則需要呼叫解析器解析 預處理 再由優化器生成對應的查詢執行計畫 3 mysql...