MariaDB 10.0.8增加了一种新的执行计划——Extended Keys。

    它充分利用了InnoDB的隐藏列来做执行计划,因为我们都知道InnoDB的索引组织表会把主键放在最末尾,所以实际上每个索引最后都包含了主键。

    打开和关闭这个优化器选项的命令如下:

    Enable:

    1. set optimizer_switch='extended_keys=on';

    Disable:

    1. set optimizer_switch='extended_keys=off';

    MariaDB 10.0.8中默认选项是 ‘extended_keys=off’. MariaDB 10.0.9开始默认选项是 ‘extended_keys=on’.

    看一个例子:

    有一个DBT-3/TPC-H 测试中用到的SQL如下

    1. select o_orderkey
    2. from part, lineitem, orders
    3. where p_retailprice > 2095 and o_orderdate='1992-07-01'
    4. and o_orderkey=l_orderkey and p_partkey=l_partkey;

    这个查询是寻找发生在1992-07-01 并且零售价格高于2095的orderkeys.

    通过 Extended Keys, 这个查询可以通过下面的计划执行:

    扫描i_p_retailprice索引获得p_retailprice>2095的行,再从 extended keys中读取p_partkey(主键)的值。 对于每一个p_partkey的值,通过对lineitem表的i_l_partkey索引扫描,从 extended index中获取l_orderkey(主键)。 对于每一个被选中的l_orderkey值,再通过i_o_orderdate索引去查找o_orderkey(主键)的值。 这种访问方式所有的访问数据都没有回表,所以性能好的多。

    下面是执行计划:

    1. MariaDB [dbt3sf10]> explain
    2. -> select o_orderkey
    3. -> from part, lineitem, orders
    4. -> where p_retailprice > 2095 and o_orderdate='1992-07-01'
    5. -> and o_orderkey=l_orderkey and p_partkey=l_partkey\G
    6. *************************** 1\. row ***************************
    7. id: 1
    8. select_type: SIMPLE
    9. table: part
    10. type: range
    11. possible_keys: PRIMARY,i_p_retailprice
    12. key: i_p_retailprice
    13. key_len: 9
    14. ref: NULL
    15. rows: 100
    16. Extra: Using where; Using index
    17. *************************** 2\. row ***************************
    18. id: 1
    19. select_type: SIMPLE
    20. table: lineitem
    21. type: ref
    22. possible_keys: PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_orderkey,i_l_orderkey_quantity
    23. key: i_l_partkey
    24. key_len: 5
    25. ref: dbt3sf10.part.p_partkey
    26. rows: 15
    27. Extra: Using index
    28. *************************** 3\. row ***************************
    29. id: 1
    30. select_type: SIMPLE
    31. table: orders
    32. type: ref
    33. possible_keys: PRIMARY,i_o_orderdate
    34. key: i_o_orderdate
    35. key_len: 8
    36. ref: const,dbt3sf10.lineitem.l_orderkey
    37. rows: 1
    38. Extra: Using index
    39. 3 rows in set (0.00 sec)