mysql檢視sql代價 mysql 代價

2021-10-18 09:45:44 字數 2224 閱讀 4376

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