MYSQL查詢效能優化

2022-04-07 14:39:10 字數 2412 閱讀 9057

mysql查詢過程如下圖所示:

mysql是通過查詢語句的雜湊查詢來命中快取的,需要注意的是如果查詢語句大小寫不一致或者有多餘的空格,是不會命中快取的。

乙個查詢通常有很多執行方式,查詢優化器通過計算開銷(隨機讀取次數)來選擇最優的查詢。

mysql把所以的查詢都當做聯接來處理,聯接是按照迴圈巢狀的策略來執行的,如下圖所示:

我們需要知道查詢優化器會做哪些優化,這樣在寫查詢的時候就可以不需要考慮手動來做這些優化,把這些事情交給查詢優化器去做是更好的選擇,查詢優化器的優化型別如下:

1. 聯接優化

(1)對聯接中的表重新排序

(2)將外聯接轉換為內聯接

2.  排序優化

(1)使用索引排序

(2)記憶體快速排序

(3)檔案排序

3. 優化count()

(1)沒有where子句的count(*):記錄表的行數

(2)count(column) 統計column非null的行數,column不可能為null時,count(column)優化為count(*)

4. 優化in()

(1)對in()裡面的資料排序,進行二分查詢,對in()子查詢不會使用這種優化,如:

5. 代數等價優化

(1)簡化並規範化代數表示式

(ab>5 and b=c and a=5

6. 早期終結

早期終結是指一旦滿足查詢的條件,mysql就會立即停止處理該查詢。

(1)limit

(2)不可能的查詢條件

(3)取得唯一值或值不存在

7. 其它優化

(1)索引優化min()和max()

(2)覆蓋索引

(3)相等傳遞

查詢優化器優化時存在一定的限制,在這些查詢優化器不能很好地優化的地方,需要我們手動進行優化:

(1)關聯子查詢。如in()可能優化得很差,如下面是個不好的優化

(2)聯合(union)。有時不能把union外的條件應用到內部

(3)索引合併。排序和合併的開銷可能很大

(4)相等傳遞。大in表導致較慢的優化

(5)並行執行。不能在多cpu並行執行乙個查詢

(6)對同乙個表select和update

查詢效率低的原因:

(1)應用程式獲取了超過需要的資料

(2)mysql伺服器分析了超過需要的行

重構查詢的方式:

(1)複雜查詢和多個查詢的權衡。用盡可能少的查詢做盡可能多的事情有時候是不對的。

(2)縮短查詢,防止查詢長時間占用表

(3)分解聯接

寫查詢時考慮以下的優化方法:

1. 優化聯接

(1)on或using使用的列上有索引

(2)group by或order by只引用乙個表的列

2. 優化count()

(1)總是使用count(*)

(2)對索引的小部分進行統計

(3)儲存統計結果

3. 優化limit和offset

在覆蓋索引上進行偏移

4. 優化子查詢

盡可能使用聯接代替in、exists、not exists

5. 優化聯合

(1)始終使用union all

(2)條件下推到union

6. 優化group by和distinct

(1)索引優化

(2)order by null跳過自動排序

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...