Mysql
MySQL - 計劃成本高於磁碟中佔用的塊數
有一張桌子
dept
,它有 100 行,都很好地塞在 1 個塊中,如mysql.innodb_index_stats
表中所示。執行以下查詢後…
select * from dept;
..查看它的優化器跟踪,我看到在行估計階段,它說 cost = 1(讀取 1 個塊),但在規劃階段,它說21。我不知道為什麼以及那裡的計算是什麼。
所有表都會發生同樣的情況。另一個例子:
有一個表
student
,它有 100000 行,包含在 609 個塊中,如mysql.innodb_index_stats
表中所示。執行以下查詢後…
select * from student;
..查看它的優化器跟踪,我看到在行估計階段,它說 cost = 609(讀取 609 個塊),但在規劃階段,它說20504。
除了 IO 成本之外,還增加了計算成本。這個成本是
#rows * row_evaluate_cost
。預設情況下row_evaluate_cost = 0.2
。在您的情況下,有 100 行,因此計算成本將為1 + 100*0.2 = 21
.
成本模型實施時,抱怨(無濟於事)它未能生效
- 數據是否可能記憶體在 RAM 中。(這有很大的不同。)
- 磁碟是 HDD 還是 SSD。(可能是成本的 10 倍。)
因此,我大多忽略“成本”。相反,我主要關注“觸及的行數(數據和/或索引)”。這在某種程度上由
FLUSH STATUS; run the query SHOW SESSION STATUS LIKE 'Handler%';
這沒有註意到 UUID 索引很可能是非常非聚集的,而不是日期範圍。
UUID(或雜湊)+ 巨大的表(大到要記憶體在 RAM 中)==> 糟糕的性能。