基於成本
Mysql執行一個查詢可以有不同的執行方案,它會選擇其中成本最低的方案.
主要計算的就是:
- 全表掃描成本
- 針對每個索引計算不同的訪問方式的成本
成本其中包括 I/O成本和CPU成本
InnoDB存儲引擎規定 讀取一個頁面花費的成本默認是1.0(I/O成本),讀取以及檢測一條記錄是否符合搜素條件的成本爲0.2(CPU成本).
如果是計算輔助索引成本 還會加上 回表成本(因爲輔助索引的葉子結點存的是主鍵而不是真實數據).
I/O成本
InnoDB存儲引擎都是將數據和索引都存儲到磁盤上的,當我們想查詢表中的記錄時,需要先把數據或者索引加載到內存中然後再操作。這個從磁盤到內存這個加載的過程損耗的時間稱之爲I/O成本。
CPU成本
讀取以及檢測記錄是否滿足對應的搜索條件 對結果集進行排序等這些操作損耗的時間爲CPU成本
join
連接原理
連接的大致原理:
- 選取驅動表,使用與驅動表相關的過濾條件,選取代價最低的訪問形式來執行對驅動表的單表查詢
- 對上一步驟中查詢驅動表得到的結果集中的每一條記錄,都分別到被驅動表中查找匹配的記錄
對應的僞代碼:
for each row in t1{
//遍歷滿足對t1單表查詢結果集中的每一條記錄
for each row in t2{
//對某條t1表的記錄來說,遍歷滿足對t2單表查詢結果集中的每一條記錄
}
}