访问路径是指数据库中访问表的方法,即使用哪个索引来访问表。

    访问路径的分析是单表查询的最重要的问题之一,对于使用主表扫描的访问路径来说,执行时间一般与需要扫描的数据量(范围)成正比。一般来说,可以使用 EXPLAIN EXTENDED 命令,将表扫描的范围段展示出来。对于有合适索引的查询,使用索引可以大大减小数据的访问量,因此对于使用主表扫描的查询,要分析没有选中索引扫描的原因,是由于不存在可用的索引,还是索引扫描范围过大以至于代价过高。

    OceanBase 数据库的路径选择方法融合了基于规则的路径选择方法和基于代价的路径选择方法。OceanBase 数据库首先会使用基于规则的路径选择方法,如果基于规则的路径选择方法之后只有一个可选择的路径,那么就直接使用该路径,否则就再使用基于代价的路径选择方法选择一个代价最小的路径。

    在 OceanBase 数据库中,用户可以通过 HINT 来指定访问路径。访问路径的 HINT 形式如下: /+INDEX(table_name index_name)/

    其中 table_name 表示表的名字,index_name 表示索引的名字。如果 index_name 是 PRIMARY,代表选择主表扫描路径。

    如下为用 HINT 来指定访问路径的示例:

    1. obclient>CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, d INT, INDEX k1(b,c));
    2. Query OK, 0 rows affected (0.10 sec)
    3. obclient>EXPLAIN SELECT/*+INDEX(t1 PRIMARY)*/ * FROM t1;
    4. | ===================================
    5. |ID|OPERATOR |NAME|EST. ROWS|COST|
    6. -----------------------------------
    7. |0 |TABLE SCAN|t1 |1000 |476 |
    8. ===================================
    9. Outputs & filters:
    10. -------------------------------------
    11. 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil),
    12. access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0)
    13. obclient>EXPLAIN SELECT/*+INDEX(t1 k1)*/ * FROM t1;
    14. | =====================================
    15. |ID|OPERATOR |NAME |EST. ROWS|COST|
    16. -------------------------------------
    17. |0 |TABLE SCAN|t1(k1)|1000 |5656|
    18. =====================================
    19. Outputs & filters:
    20. -------------------------------------
    21. 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil),
    22. access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0)