zoukankan      html  css  js  c++  java
  • 8.2.1.7 Use of Index Extensions 索引扩展使用

    8.2.1.7 Use of Index Extensions 索引扩展使用

    InnoDB 会自动扩展每个2级的index 通过主键列:

    CREATE TABLE t1 (
    i1 INT NOT NULL DEFAULT 0,
    i2 INT NOT NULL DEFAULT 0,
    d DATE DEFAULT NULL,
    PRIMARY KEY (i1, i2),
    INDEX k_d (d)
    ) ENGINE = InnoDB;

    该表定义了主键在列(i1,i2),也定义了第2个索引 k_d 在d列上,但内部的InnoDB 扩展这个索引,把它对待成(d,i1,i2)

    就是索引k_d在d列上,会扩展把主键的列加入

    作为5.6.9,优化器将主键列进去,从而更有效的查询执行计划和更好的性能

    优化器可以使用扩展的2级索引作为参考, range和index_merge 索引访问, 对于松散的索引扫描,对于join和排序优化,min和max优化

    下面的示例演示执行计划被影响通过优化器是否使用extened 2级索引:

    INSERT INTO t1 VALUES
    (1, 1, ‘1998-01-01’), (1, 2, ‘1999-01-01’),
    (1, 3, ‘2000-01-01’), (1, 4, ‘2001-01-01’),
    (1, 5, ‘2002-01-01’), (2, 1, ‘1998-01-01’),
    (2, 2, ‘1999-01-01’), (2, 3, ‘2000-01-01’),
    (2, 4, ‘2001-01-01’), (2, 5, ‘2002-01-01’),
    (3, 1, ‘1998-01-01’), (3, 2, ‘1999-01-01’),
    (3, 3, ‘2000-01-01’), (3, 4, ‘2001-01-01’),
    (3, 5, ‘2002-01-01’), (4, 1, ‘1998-01-01’),
    (4, 2, ‘1999-01-01’), (4, 3, ‘2000-01-01’),
    (4, 4, ‘2001-01-01’), (4, 5, ‘2002-01-01’),
    (5, 1, ‘1998-01-01’), (5, 2, ‘1999-01-01’),
    (5, 3, ‘2000-01-01’), (5, 4, ‘2001-01-01’),
    (5, 5, ‘2002-01-01’);
    Now consider this query:

    EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = ‘2000-01-01’

    优化器不能使用主键在这种情况下, 包括列(i1,i2),查询不指向i2,相反,优化器可以使用第2个索引 k_d 在(d)列上,

    执行计划依赖是否扩展索引被使用:

    当优化器不考虑索引扩展, 它将索引k_d 只作为(d)列,解释查询产生这个结果

    mysql> EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = ‘2000-01-01’G
    ***************** 1. row *****************
    id: 1
    select_type: SIMPLE
    table: t1
    type: ref
    possible_keys: PRIMARY,k_d
    key: k_d
    key_len: 4
    ref: const
    rows: 5
    Extra: Using where; Using index

    当优化器需要让Index 扩展,它对待k_id 作为(d,i1,i2) 在这种情况下,

    他可以使用最左边的索引前缀(d,i1) 来产生刚好的执行计划。
    mysql> EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = ‘2000-01-01’G
    ***************** 1. row *****************
    id: 1
    select_type: SIMPLE
    table: t1
    type: ref
    possible_keys: PRIMARY,k_d
    key: k_d
    key_len: 8
    ref: const,const
    rows: 1
    Extra: Using index

        在这两种情况下, key表明优化器使用secondary 索引k_id,但是输出显示
    
        那些改善从使用扩展索引来改善。
    
        1.key_len 从4个字节到8个字节, 表明key 查找使用列d和i1,不只是d.
    
        2.从const常量的参考值的变化,const因为重点查找使用的关键部分,而不是一个。
    
        3.行数从5降到1,表明InnoDB 需要检测较小的行来产生结果。
    
        4. 额外的值改变,使用index 来使用索引,这个意味着 记录可以只读取索引,
    
        而不使用访问数据记录。
    
  • 相关阅读:
    openlayers + webpack
    openlayers Map 和 es6的容器Map重名
    git 代理
    剑魂史诗套配装
    剑魂卢克攻略
    DNF斩铁剑魂每日1-5及打团须知
    APP自识别安卓苹果
    各浏览器老板键
    Apache+mod_encoding解决URL中文编码问题
    linux命令之crontab定时执行任务
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351435.html
Copyright © 2011-2022 走看看