mysql優化器RBO mysql查詢優化器

2021-10-19 03:11:30 字數 2232 閱讀 3882

引用連線

優化器分類

傳統關係型資料庫裡面的優化器分為cbo和rbo兩種。

rbo— rule_based potimizer 基於規則的優化器:

rbo :rbo所用的判斷規則是一組內建的規則,這些規則是硬編碼在資料庫的編碼中的,rbo會根據這些規則去從sql諸多的路徑中來選擇一條作為執行計畫(比如在rbo裡面,有這麼一條規則:有索引使用索引。那麼所有帶有索引的表在任何情況下都會走索引)所以,rbo現在被很多資料庫拋棄(oracle預設是cbo,但是仍然保留rbo**,mysql只有cbo)

rbo最大問題在於硬編碼在資料庫裡面的一系列固定規則,來決定執行計畫。並沒有考慮目標sql中所涉及的物件的實際數量,實際資料的分布情況,這樣一旦規則不適用於該sql,那麼很可能選出來的執行計畫就不是最優執行計畫了。

cbo—cost_based potimizer 基於成本的優化器:

cbo :cbo在會從目標諸多的執行路徑中選擇乙個成本最小的執行路徑來作為執行計畫。這裡的成本他實際代表了mysql根據相關統計資訊計算出來目標sql對應的步驟的io,cpu等消耗。也就是意味著資料庫裡的成本實際上就是對於執行目標sql所需要io,cpu等資源的乙個估計值。而成本值是根據索引,表,行的統計資訊計算出來的。(計算過程比較複雜)

個人對優化器的理解

優化器會盡量使用到索引,並且使用開銷最小的那個.

下圖是查詢的情況,這裡使用到了name欄位索引.

優化器會分析name和display_name兩個字段,乙個會排除兩行資料,另乙個會排除一行資料.查詢優化器會尋找較少的計算也就是name欄位索引.

以下是修改後的資料

下面是同樣的查詢語句,使用到了display_name欄位索引.

個人的疑問

這個是資料

下圖是查詢得到的結果.我之前自己嘗試的較少有個錯誤的結論,就是當查詢結果的資料佔到整個資料的一半時,會掃瞄所有行.

修改後的資料

下圖我**啪打臉,這裡只是掃瞄了三行並且用到了索引.

還有乙個問題就是乙個組合索引,查詢條件並沒有用到最左邊那個字段,優化器竟然用到了索引,可能它認為這樣會更加高效,但是組合索引不是有最左字首原則嗎?這個問題來自構建高效能web站點修訂版p250.

MySQL優化 伺服器優化

標籤 空格分隔 mysql 伺服器的硬體效能直接決定著mysql資料庫的效能,硬體的效能瓶頸,直接決定mysql資料庫的執行速度和效率。需要從以下幾個方面考慮 1 配置較大的記憶體。足夠大的記憶體,是提高mysql資料庫效能的方法之一。記憶體的io比硬碟快的多,可以增加系統的緩衝區容量,使資料在記憶...

mysql 索引優化器 Mysql之查詢優化器

對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化 優化分為 1.條件優化 2.計算全表掃瞄成本 3.找出所有能用到的索引 4.針對每個索引計算不同的訪問方式的成本 5.選出成本最小的索引以及訪問方式 開啟查詢優化器日誌 開啟 set optimizer trace en...

MYSQL查詢優化器

1 優化器本質 計算io成本 減少io訪問次數 計算cpu成本 制定成本消耗最低的方案 2 優化的兩個階段 邏輯查詢計畫優化 邏輯表示式,算術運算子等 物理查詢計畫優化 mysql中的各級buffer cache 1 buffer cache用於訪問加速以記憶體空間換取效能 2 在幾乎所有需要磁碟i...