用 EXPLAIN 查看索引合并的 SQL 执行计划

    在 v5.4.0 及以上版本的新建集群中,索引合并默认开启。在其他情况下如果未开启,可将 的值设为 ON 来开启索引合并功能。

    1. EXPLAIN SELECT * FROM t WHERE a = 1 OR b = 1;
    2. +-------------------------+----------+-----------+---------------+--------------------------------------+
    3. | id | estRows | task | access object | operator info |
    4. +-------------------------+----------+-----------+---------------+--------------------------------------+
    5. | TableReader_7 | 8000.00 | root | | data:Selection_6 |
    6. | └─Selection_6 | 8000.00 | cop[tikv] | | or(eq(test.t.a, 1), eq(test.t.b, 1)) |
    7. +-------------------------+----------+-----------+---------------+--------------------------------------+
    8. EXPLAIN SELECT /*+ USE_INDEX_MERGE(t) */ * FROM t WHERE a > 1 OR b > 1;
    9. +--------------------------------+---------+-----------+-------------------------+------------------------------------------------+
    10. | id | estRows | task | access object | operator info |
    11. +--------------------------------+---------+-----------+-------------------------+------------------------------------------------+
    12. | IndexMerge_16 | 6666.67 | root | | |
    13. | ├─IndexRangeScan_14(Build) | 3333.33 | cop[tikv] | table:t, index:idx_b(b) | range:(1,+inf], keep order:false, stats:pseudo |
    14. | └─TableRowIDScan_15(Probe) | 6666.67 | cop[tikv] | table:t | keep order:false, stats:pseudo |

    在索引合并访问方式下,优化器可以选择对一张表使用多个索引,并将每个索引的返回结果进行合并,生成以上示例中后一个执行计划。此时的 IndexMerge_16 算子有三个子节点,其中 IndexRangeScan_13IndexRangeScan_14 根据范围扫描得到符合条件的所有 RowID,再由 算子根据这些 RowID 精确地读取所有满足条件的数据。