• MariaDB · 性能优化 · Extended Keys


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

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

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

    Enable:

    set optimizer_switch='extended_keys=on';
    

    Disable:

    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如下

    select o_orderkey
    from part, lineitem, orders
    where p_retailprice > 2095 and o_orderdate='1992-07-01'
    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(主键)的值。 这种访问方式所有的访问数据都没有回表,所以性能好的多。

    下面是执行计划:

    MariaDB [dbt3sf10]> explain
    -> select o_orderkey
    ->   from part, lineitem, orders
    ->   where p_retailprice > 2095 and o_orderdate='1992-07-01'
    ->         and o_orderkey=l_orderkey and p_partkey=l_partkeyG
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: part
    type: range
    possible_keys: PRIMARY,i_p_retailprice
    key: i_p_retailprice
    key_len: 9
    ref: NULL
    rows: 100
    Extra: Using where; Using index
    *************************** 2. row ***************************
    id: 1
    select_type: SIMPLE
    table: lineitem
    type: ref
    possible_keys: PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_orderkey,i_l_orderkey_quantity
    key: i_l_partkey
    key_len: 5
    ref: dbt3sf10.part.p_partkey
    rows: 15
    Extra: Using index
    *************************** 3. row ***************************
    id: 1
    select_type: SIMPLE
    table: orders
    type: ref
    possible_keys: PRIMARY,i_o_orderdate
    key: i_o_orderdate
    key_len: 8
    ref: const,dbt3sf10.lineitem.l_orderkey
    rows: 1
    Extra: Using index
    3 rows in set (0.00 sec)
    螃蟹在剥我的壳,笔记本在写我,漫天的我落在枫叶上雪花上,而你在想我。 --章怀柔
  • 相关阅读:
    (转) c++ 迭代器
    (转) 学习C++ -> 向量(vector)
    latex 模版
    javascript继承篇
    ES6的Map和Set的使用,以及weakMap的一点理解
    JavaScript中的eval函数
    Node.js中的进程与线程
    普通函数与箭头函数的区别是什么?
    git 远程拉去代码 输入用户名密码
    npm 设置镜像
  • 原文地址:https://www.cnblogs.com/lovezhr/p/13264067.html
Copyright © 2020-2023  润新知