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 需要检验更少的记录来产生结果集

原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6199137.html