コストモデル
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 は 2 つのインデックスのコストを計算します。
- インデックス
b
のコスト = 行数b < 100
インデックスb
の長さ = 20 8 = 160 - インデックス
c
のコスト = 行数c < 100
インデックスc
の長さ = 500 8 = 4000
インデックスb
のコストが低いため、TiDB はインデックスとしてb
選択します。
上記の例は簡略化されており、基本原理を説明するためにのみ使用されています。実際のSQL実行では、TiDBのコストモデルはより複雑になります。
コストモデル バージョン 2
TiDB v6.2.0 では、新しいコスト モデルであるコスト モデル バージョン 2 が導入されています。
コスト モデル バージョン 2 では、コスト式のより正確な回帰キャリブレーションが提供され、コスト式の一部が調整され、以前のバージョンのコスト式よりも正確になっています。
コストモデルのバージョンを切り替えるには、 tidb_cost_model_version
変数を設定します。
注記:
コスト モデルのバージョンを切り替えると、クエリ プランが変更される可能性があります。