使用 Index Merge 方式访问表
本节介绍 IndexMerge
的适用场景、实际用例以及开启方法。
对于 SQL 查询中涉及的每一张表,以前的 TiDB 优化器在物理优化阶段,会根据代价估算从以下三种表访问方式中选择一种:
IndexScan
:以索引列的值为 key 对索引数据进行扫描IndexLookUp
:先用索引列的值为 key 从索引获取到_tidb_rowid
集合,再回表取出对应的数据行
这三种方式对每张表最多只能使用一个索引,在有些情况下选出的执行计划并不是最优的,比如:
当 t
的数据量很大时,全表扫描的效率会很低,但这条查询最多却只会返回两行记录。针对这类场景,TiDB 引入了对表的新访问方式 IndexMerge
。
在 IndexMerge
访问方式下,优化器可以选择对一张表使用多个索引,并将每个索引的返回结果进行集合并操作。以上面查询为例,生成的执行计划将会变为:
IndexMerge
执行计划的结构和 IndexLookUp
很接近,都可以分为索引扫描和全表扫描两部分,只是 IndexMerge
的索引扫描部分可以包含多个 IndexScan
,当表的主键索引是整数类型时,索引扫描部分甚至可能包含一个 TableScan
,比如:
默认设置下,IndexMerge
是关闭的,开启的方法有两种:
设置系统变量
tidb_enable_index_merge
为 1