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