8.2.1.7 Use of Index Extensions 使用索引扩展

来源:互联网 发布:朱文臣 的网络与 编辑:程序博客网 时间:2024/05/22 14:34
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: refpossible_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: refpossible_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,不只是d2. ref的值从 const to const,const  因为索引差尊使用2个索引部分,不是一个3.记录统计从5降低到1,表明InnoDB 需要检验更少的记录来产生结果集

0 0