【发布时间】:2016-06-08 03:30:08
【问题描述】:
这是 mysql(innodb) 中解释命令的输出:
explain select * from multi_index_test_tbl_1 force index(`query_index_1`) where `text_field1`='0' order by `numeric_field2` desc limit 1000000;
+----+-------------+------------------------+------+---------------+---------------+---------+-------+----------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------+------+---------------+---------------+---------+-------+----------+--------------------------+
| 1 | SIMPLE | multi_index_test_tbl_1 | ref | query_index_1 | query_index_1 | 386 | const | 53547628 | Using where; Using index |
+----+-------------+------------------------+------+---------------+---------------+---------+-------+----------+--------------------------+
表multi_index_test_tbl_1的架构如下:
CREATE TABLE IF NOT EXISTS `multi_index_test_tbl_1`
(
`text_field1` varchar(128) NOT NULL,
`numeric_field1` float NOT NULL,
`numeric_field2` float NOT NULL,
`text_field2` varchar(128) NOT NULL,
PRIMARY KEY (`text_field1`,`numeric_field1`,`text_field2`),
KEY `query_index_1` (`text_field1`,`numeric_field2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
似乎使用了query_index_1。并且“使用索引”出现在Extra 中,而索引query_index_1 不包含表multi_index_test_tbl_1 中的所有字段。
因为 mysql 文档是这样说的:
使用索引(JSON 属性:using_index)
仅使用索引树中的信息从表中检索列信息,而无需进行额外的查找以读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。
我很困惑这里到底发生了什么。
【问题讨论】:
-
@zerkms mysql 文档说
using index表示使用only information in the index检索列 -
为什么不显示表架构?你为什么要强制索引然后想知道为什么它说“好的,我会使用那个索引”
-
@Drew 抱歉,我已经添加了架构。但问题是:根据官方文档,
using index不仅表示使用了索引,还表示没有使用实际行(因此是聚集索引)。 -
您意识到
explain返回的信息中有一半有时是边缘幻想之地。您要求例行程序在一瞬间将信息返回给我们不耐烦的消费者。并在那一瞬间确定其所谓的计划。它可以在实际运行时愉快地偏离。并且该执行可能需要长达 10 个小时才能运行(当不使用explain但实际运行时)。