用 EXPLAIN 查看开启 IndexMerge 的 SQL 执行计划
例如,在上述示例中,过滤条件是使用 OR
条件连接的 WHERE
子句。在启用 IndexMerge
前,每个表只能使用一个索引,不能将 a = 1
下推到索引 a
,也不能将 b = 1
下推到索引 b
。当 t
中存在大量数据时,全表扫描的效率会很低。针对这类场景,TiDB 引入了对表的新访问方式 IndexMerge
。
在 访问方式下,优化器可以选择对一张表使用多个索引,并将每个索引的返回结果进行合并,生成以上示例中后一个 IndexMerge
的执行计划。此时的 IndexMerge_16
算子有三个子节点,其中 IndexRangeScan_13
和 IndexRangeScan_14
根据范围扫描得到符合条件的所有 RowID
,再由 TableRowIDScan_15
算子根据这些 RowID
精确地读取所有满足条件的数据。