mysql cbo cost base optimizer 基於代價,資料是一直變化的
oracle8 以前是rbo rule base optimizer 基於規則, 如果sql使用了索引,必須使用索引,儘管全表掃瞄比索引快
代價= cpu cost + io cost
1)計算全表掃瞄代價
a)cpu cost
(double) records / time_for_compare + 1
records為表會統計的所有記錄個數
time_for_compare 為5,即cpu每比較5條記錄,計1個cost, 是mysql層統計
b)io cost
(double) (prebuilt->table->stat_clustered_index_size
聚簇索引葉頁面數
2)索引範圍掃瞄代價
a)主鍵,唯一索引 io cost
a1)cpu cost
範圍查詢估算的記錄/time_for_compare+1
a2)io cost
(range+row)/(總記錄/聚焦索引的頁面數)
通過範圍查詢,估算出有100條記錄,總記錄500條,共有20個page
那麼乙個page能裝載500/20=25條記錄,那100條記錄 需要 100/25=4條記錄來裝載
b)二級索引覆蓋索引
b1)cpu cost
範圍查詢估算的記錄數/time_for_compare+1
b2)io cost
範圍查詢估算的記錄數/keys_per_page
c)二級索引 非覆蓋索引
c1)cpu cost
範圍查詢估算的記錄數/time_for_compare+1
c2)io cost
範圍查詢估算的記錄數, 需要回表,但可能對應的主鍵有若干個在同乙個page
關於mysql cost 成本的計算方式,感覺計算過程是不太合理的,也常常是不精確的,計算結果傾向於進
行全表掃瞄,在mysql 中,cost 成本模型是分別計算cpu cost 和io cost,然後把兩者相加而得到最終的
總成本, 並沒有考慮到cpu&io 的權重因素、機器cpu 實際處理速度、 io 的實際能力和當前的負載等因素,
對這塊的統計資料也沒有收集操作。
公式簡要說明如下:
單錶時:
cost = io_cost + cpu_cost;
v vread_time + found_records / (double) time_for_compare==5
其中的read_time 和found_records 計算過程按不同的type 如下:
當type 為:
system & const: //const_tab
found_records=read_time=1;
當type 為:
index : //covering index
uint keys_per_block= (index_block_size/2/key_len) + 1); //塊一半滿,除以鍵長度
read_time=((double) (records+keys_per_block-1)/(double) keys_per_block);
found_records = ranges 區間掃瞄得到的總行數;(當儲存引擎不支援index filter 時,
為下行扇出的記錄條數和)
當type 為:
ref_[or_null]: //ref
read_time = found_records + ranges;
found_records = ranges 區間掃瞄得到的總行數; (當儲存引擎不支援index filter 時,
為下行扇出的記錄條數和)
default:(type 其實為all)
found_records=全表記錄;
read_time= 全索引pages 數目;
join時為:
總cost= 前表cost + 後表cost * 前表found_records
(採用貪婪演算法,找出誰先誰後順序進行join.)
估算card 時,部分動作可以觸發統計資訊的收集,包括analyze、show table status 等,在innodb
中為8 個分散索引塊掃瞄後計算得到的,也看到有人改為用64 塊進行統計資訊的收集,同時關閉引數
innodb_stats_method,以保證執行計畫的穩定性。
針對mysql的sql注入漏洞測試 MySql版
我們先來判斷下這個表中有幾個字段使用 order by 如下圖 如果說頁面不正常了,肯定就超過這個數了,比如我們使用6來。6報錯那就表述這個字段只有5個了。id 1 order by 6 id 1 1 union select 1,2,3,4,5 下面獲取每個字段我們換成user version資料...
Mysql用SQL命令檢視Mysql資料庫大小
要想知道每個資料庫的大小的話,步驟如下 1 進入information schema 資料庫 存放了其他的資料庫的資訊 use information schema 2 查詢所有資料的大小 select concat round sum data length 1024 1024 2 mb as d...
mysql檢視sql執行過程 SQL查詢執行過程
mysql查詢執行過程客戶端向伺服器傳送請求 伺服器查詢快取,快取中命中則結束,將結果返回客戶端 返回前會檢查使用者許可權 否則繼續下邊步驟 伺服器端進行sql解析 預處理,再由優化器生成對應的執行計畫 根據執行計畫呼叫儲存引擎的api執行查詢 將結果返回客戶端 一 查詢快取 如果一條sql語句以s...