Mysql

MySQL - 計劃成本高於磁碟中佔用的塊數

  • December 20, 2021

有一張桌子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 中)==> 糟糕的性能。

引用自:https://dba.stackexchange.com/questions/305193