覆盖索引的优先级是否高于mysql中最左边的前缀索引策略?

时间:2013-12-24 09:36:05

标签: mysql indexing

我有一个名为test的表:

mysql> describe test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| coll1 | int(11) | YES  | MUL | NULL    |       |
| coll2 | int(11) | YES  |     | NULL    |       |
| coll3 | int(11) | YES  |     | NULL    |       |
| coll4 | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

我在桌子上有一个索引:

mysql> show index from test;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------  +------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test  |          1 | hi       |            1 | coll1       | A         |           0 |     NULL | NULL   | YES  | BTREE       |         |               |
| test  |          1 | hi       |            2 | coll2       | A         |           0 |     NULL | NULL   | YES  | BTREE       |         |               |
| test  |          1 | hi       |            3 | coll3       | A         |           0 |     NULL | NULL   | YES  | BTREE       |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

由于最左边的前缀索引策略,以下输出很容易理解。

mysql> explain select * from test where coll2=1;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

我知道覆盖索引的内容,但这是怎么发生的?这是否意味着覆盖索引的优先级高于最左边的前缀索引策略?

mysql> explain select coll1 from test where coll2=1;
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | test  | index | NULL          | hi   | 15      | NULL |    1 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+

P.S。 我正在使用mysql版本5.6.13

2 个答案:

答案 0 :(得分:0)

抱歉我的英语不好。

表格文件由DATA file + INDEX files组成。通常,一个复合INDEXed列是所有列的子集。这意味着某些INDEX文件大小小于DATA文件大小。因此,以下查询使用hi INDEX扫描,其读取的磁盘数量少于DATA完全扫描。

SELECT coll1 FROM test WHERE coll2=1;

但是当您按如下方式检索coll1, coll4时,coll4不是hi索引的一部分。因此,完整的数据扫描速度更快。

SELECT coll1, coll4 FROM test WHERE coll2=1;

答案 1 :(得分:0)

简单回答

长答案(仍然很简单解释)

MySQL优化器将对您的查询使用基于成本的分析来计算最低的执行成本。 覆盖索引的发生是因为查询强制MySQL优化器使用覆盖索引,因为这是最便宜的执行。

select coll1 from test where coll2=1

因为coll1和coll2都是索引的,MySQL优化器认为它只能通过访问索引数据来满足查询结果(覆盖索引)

根据故事的座右铭,最便宜的访问计划将获得更高的优先级