1. 程式人生 > 資料庫 >Mysql 查詢優化成本的計算,索引一定快?

Mysql 查詢優化成本的計算,索引一定快?

在一些Mysql的面試題中,一定會問到Mysql優化的問題,可能大部分人都會回答,加索引就可以解決,查詢慢的問題,那麼接下來別人可能又會問到,那索引是不是加的越多越好呢,或者說索引是不是什麼欄位都可以加,什麼欄位不應該加呢,又或者說為什麼有些查詢明明加了索引還是慢呢?今天來說說mysql是如何計算查詢優化的成本的。

一.計算全表掃描的代價

計算全部掃描需要2個重要的資料:
1.聚簇索引佔用的頁面數
2.表中的記錄數
這兩數使用 SHOW TABLE STATUS LIKE ‘single_table’ (single_table) 這個是表 名 查看錶中 頁面數和 記錄數

Data_length : 表中的佔用儲存空間的位元組數

rows: 表中的記錄數

計算IO成本 :
Data_length 值假設 1589248 先計算出 聚簇索引佔用的頁面數 是多少

聚簇索引 頁面數量= 1589248 ÷16 ÷ 1024  = 97 在這裡插入程式碼片

IO成本: 97 * 1.0 + 1.1 = 98.1
97是頁面資料 1.0 是讀取一個頁的時間 1.1 是mysql的微調值

計算CPU成本:
rows 的值假設是 9636 記錄計算出CPU成本

CPU成本:  9636  * 0.2 + 1.0 = 1939.6

全表掃描的成本:98.1 + 1939.6 = 2037.7

二.計算索引區間查詢的代價

假設 key 二級索引 查詢 ,條件為 key > 10 and key < 1000 那麼查詢的區間就是 [10,1000],執行 二級索引查詢後,記錄數 為 98 (假設的值)

計算IO成本 :1.0+ 98 * 1.0 =99(1.0是 區間數) 98 記錄數 1.0(常數)
計算CPU成本 : 98 *0.2 + 0.01 + 98 * 0.2 = 39.21(二級索引讀取記錄成本) (回表記錄成本)

二級索引單區間索引查詢成本: 99 + 39.21 = 138.21

三。多個區間計算的成本

假設 key 二級索引 查詢,條件為 key2 in(‘a’,‘b’,‘c’,‘d’,‘e’), 那麼 區間查詢 [a,a] 查詢到的記錄數 為 34 [b,b]查詢到的記錄數 為 25 [c,c]查詢到的記錄數為 60 ,[d,d]查詢到的記錄數為 70,
[e,e]查詢到的記錄數為 77 (假設二級索引查詢到的記錄數) 總記錄數為: 266

計算IO成本: 5.0+266 *1.0 = 271
計算CPU成本 266 * 0.2 + 0.01 + 266 * 0.2 = 106.41
二級索引多區間索引查詢成本:377.41

以上分析為單表查詢 ,mysql 執行計劃會以哪種查詢成本低,而選擇其中的查詢方式。所以這就是為什麼加了索引也不一定快的原因,mysql查詢優化器會幫我們計算是不是使用索引還是說使用全表掃描的時間快,那個快就用那個。