我有一个名为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
答案 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优化器认为它只能通过访问索引数据来满足查询结果(覆盖索引)
根据故事的座右铭,最便宜的访问计划将获得更高的优先级