Cost Model
TiDB 使用成本模型在 物理优化 过程中选择索引和操作符。该过程在下图中进行了示意:
TiDB 计算计划中每个索引的访问成本和每个物理操作符(如 HashJoin 和 IndexJoin)的执行成本,并选择成本最低的计划。
以下是一个简化的示例,用于说明成本模型的工作原理。假设有一张表 t
:
mysql> SHOW CREATE TABLE t;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t | CREATE TABLE `t` (
`a` int DEFAULT NULL,
`b` int DEFAULT NULL,
`c` int DEFAULT NULL,
KEY `b` (`b`),
KEY `c` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
在执行 SELECT * FROM t WHERE b < 100 and c < 100
语句时,假设 TiDB 估算满足 b < 100
条件的行数为 20 行,满足 c < 100
条件的行数为 500 行,且 INT
类型索引的长度为 8。然后,TiDB 计算两个索引的成本:
- 索引
b
的成本 = 行数b < 100
* 索引b
的长度 = 20 * 8 = 160 - 索引
c
的成本 = 行数c < 100
* 索引c
的长度 = 500 * 8 = 4000
由于索引 b
的成本较低,TiDB 选择 b
作为索引。
上述示例为简化示意,仅用以说明基本原理。在实际 SQL 执行中,TiDB 的成本模型会更加复杂。
Cost Model Version 2
TiDB v6.2.0 引入了 Cost Model Version 2,这是一个新的成本模型。
Cost Model Version 2 提供了更为准确的成本公式回归校准,调整了部分成本公式,优于之前版本的成本公式的准确性。
要切换成本模型的版本,可以设置 tidb_cost_model_version
变量。