• 8.2.1.7 Use of Index Extensions 使用索引扩展


    8.2.1.7 Use of Index Extensions 使用索引扩展
    
    InnoDB 自动扩展每个secondary index 通过添加primary key columns to it,考虑表定义如下:
    
    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)上, 它也定义了一个secondary index k_d 在列(d)上,
    
    
    但是内部的InnoDB extends 这个index 对待为(d,i1,i2)
    
    
    在MySQL 5.6.9之前, 优化器不把主键列加进来 当确定如何和何时使用索引时。
    
    
    在5.6.9后, 优化器将主键列加进来
    
    
    优化器可以使用扩展secondary 索引用于ref,range和 index_merge index 访问,
    
    
    对松散索引扫描,对于join和排序操作,和min()/max()优化
    
    
    下面的例子显示使用扩展secondary 索引如何影响执行话,假设t1是填充下面记录:
    
    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');
    
    考虑下面的查询:
    
    EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01'
    
    
    优化器不能使用主键 在这种情况下 因为包含列(i1,i2) 查询不涉及i2.
    
    相反, 优化器可以使用 secondary index k_d在(d)上,
    
    执行计划取决于 是否extentded 索引被使用
    
    当优化器不考虑index extensions,它对待index k_d 只作为(d)
    
    EXPLAIN  查询产生如下:
    
    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_d 作为(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 index k_d 
    
    
    但是EXPLAIN 输出那些使用extentded index 改进
    
    1. key_len 从4字节到8字节,表明key 索引查询使用列d和i1,不只是d
    
    2. ref的值从 const to const,const  因为索引差尊使用2个索引部分,不是一个
    
    3.记录统计从5降低到1,表明InnoDB 需要检验更少的记录来产生结果集
    

  • 相关阅读:
    Python统计字符串中出现次数最多的人名
    初探CORBA组件化编程
    shell脚本—基础知识,变量
    Java多线程--线程交替
    Qt中采用多线程实现Socket编程
    Python字符串格式化--formate()的应用
    JAVA中浅复制与深复制
    Python这些问题你会吗?
    PHP控制反转(IOC)和依赖注入(DI
    Go 语言指针
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13350189.html
Copyright © 2020-2023  润新知