評估等值/範圍條件的 found_records(預估命中行數),供後續成本計算使用。InnoDB 透過索引頁採樣估算,無直方圖統計時精度有限。
表 A: A.LastName = 'zhou' → found_records: 51 表 B: B.DepartmentName = 'TBX' → found_records: 1
MySQL 列舉所有左深樹,尋找最低總成本。表數 < optimizer_search_depth(預設 62)時全量窮舉。
先按 found_records 升序排表,記錄少的優先嘗試做驅動表。本例順序:B → A。
IND_D,只能用 IND_DN(DepartmentName='TBX'),IO 成本 1,總成本 1.2IND_L_D (LastName='zhou', IO 成本 15→修正 25.2) 或 IND_DID (DepartmentID=B.DepartmentID, 前表 1 行 → 預估 1 行, IO 成本 1, 總成本 1.2)IND_DID,總成本 1.2 + 1.2 = 2.4IND_L_D,成本 25.2 已超過最優 2.4,直接剪枝# 構造資料分布傾斜
INSERT INTO employee VALUES ("zhou", 27760); -- 1 筆
INSERT INTO department VALUES (27760, "TBX"); -- 10 筆同 DepartmentName
INSERT INTO department VALUES (27760, random); -- 1000 筆同 DepartmentID
導致優化器選擇 IND_D(DepartmentID)而非 IND_DN,實際掃描 1010 行 vs 最優 10 行。
Cardinality 均勻假設STRAIGHT_JOIN、USE INDEX、ANALYZE TABLE 更新統計