1.單表的查詢成本計算
mysql查詢一條sql的成本,包含IO成本和CPU成本退个。其中IO成本就是我們讀取或者處理數(shù)據(jù)的時候把數(shù)據(jù)會從磁盤加載到內(nèi)存中所用的時間募壕;CPU成本就是數(shù)據(jù)加載到內(nèi)存后需要讀取以及檢測數(shù)據(jù)記錄是不是滿足你sql中的對應條件,以及要是涉及到排序的時候需要進行排序這些操作的消耗的時間就是cpu成本。
對于innodb來說语盈,其中讀取一頁所需要成本為1.0舱馅;訪問一條記錄所需要的cpu成本就是0.2,所以成本計算:(IO頁數(shù)*1.0+微調(diào)數(shù))+(記錄數(shù)*0.2+微調(diào)數(shù))
查看mysql的一條sql的查詢成本:
set optimizer_trace='enabled=on';
select * from order where order_no in?('202111081535172900000007','202111111612098550000009','202111151738163880000015')
and order_status='4' and company_id > 6 and?company_id?<=8;
select * from information.optimizer_trace;
SQL: 其中order_no加上了唯一索引,order_status刀荒、company_id加上了普通索引代嗤。
select * from order where order_no in ('202111081535172900000007','202111111612098550000009','202111151738163880000015')
and company_id > 6 and company_id?<=8;
全表掃描:
IO成本: 8*1.0+1.1(微調(diào)數(shù),這個是mysql指定的常數(shù))=9.1
(對于全表掃描的需要讀取的頁數(shù):show table status like 'vouching_order';可以查詢出data_length和row的值缠借,分別為131072和292干毅,可以計算出IO頁數(shù)131072/16/1024=8頁)
CPU成本: 292*0.2+1.0(微調(diào)數(shù),這個是mysql指定的常數(shù))=59.4
全表掃描的成本:9.1+59.4=68.5
索引unique_order_no(company_id \order_status和這個一樣泼返,只是他們都是一個區(qū)間范圍):
二級索引成本計算
IO成本:3*1.0=3 (不論某個范圍區(qū)間有多少個頁面硝逢,因為二級索引是連續(xù)的,順序IO特別快,一個區(qū)間內(nèi)的順序IO就相當于一個頁的IO操作渠鸽,所以對于IN來說叫乌,三個值相當于3個范圍區(qū)間的查找,即相當于3個頁面的查找)
CPU成本:3*0.2+0.01(微調(diào)數(shù))=0.61
回表成本計算
IO成本:3*1.0=3 (對于回表操作來說徽缚,加載記錄相當于隨機IO综芥,所以讀取一條記錄就相當于讀取一頁的操作)
CPU成本:3*0.2=0.6
成本:3+0.61+3+0.6=7.21 ?但是實際上和全表掃描比較成本的時候使用索引的成本會減去讀取并檢測回表后聚簇索引記錄的CPU成本,所以實際上3+0.61+3=6.61猎拨,如果比較完成膀藐,會再計算一次使用索引的成本,這時就會加上減去的成本了红省。