【发布时间】:2012-02-17 16:10:43
【问题描述】:
有谁知道
使用索引
和
在哪里使用;使用索引
在 mysql 的解释输出中(在 Extra 中)?
复制:
CREATE TABLE `tmp_t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL DEFAULT '0',
`b` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k1` (`a`),
KEY `k2` (`b`)
) ENGINE=InnoDB AUTO_INCREMENT=5;
insert into tmp_t1 (a,b) values (1,'b1'), (1, 'b2'), (2, 'b3');
mysql> 解释 select count(1) from tmp_t1 where a=1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_t1
type: ref
possible_keys: k2,kz
key: kz
key_len: 4
ref: const
rows: 3
Extra: Using index
1 row in set (0.11 sec)
mysql> 解释 select count(1) from tmp_t1 where b='b1' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_t1
type: ref
possible_keys: k3
key: k3
key_len: 52
ref: const
rows: 2
Extra: Using where; Using index
1 row in set (0.00 sec)
有谁知道为什么在第一种情况下额外字段中只有“使用索引”,而在第二种情况下是“使用 where;使用索引”? 案例之间的区别在于,第一个案例在整数上运行 WHERE,而第二个案例在 varchar(50) 字段上执行。 但是这有什么关系呢??
感谢您的帮助!
【问题讨论】:
-
using where表示您的 SQL 中有一个过滤器(=WHERE子句)。using index表示查询使用索引。两者都是不同的东西。我不明白这个问题。 -
问题是为什么mysql只使用索引来执行第一个查询,而执行第二个查询时会报告“使用where”。我之所以这么问,是因为我无法理解这两个查询之间的区别——一个在 where 条件中使用整数,另一个是 varchar 字段这一事实如何影响 mysql 执行它们的方式(为什么第二个查询不使用“仅索引”?)
-
第一个 EXPLAIN 中提到并实际使用的
kz索引是什么? -
现在编辑后您的问题更有意义。但
SHOW CREATE TABLE与您的EXPLAIN SELECT语句不匹配。您的 EXPLAIN 中有键“k3”和“kz”,但 CREATE TABLE 中没有。我想您的问题是我们看不到的,因为您没有发布相关部分。 -
使用“WHERE a = 1”时,您的第一个解释的“rows: 3”也与您的示例数据不匹配......您只有 2 行。 (类似于第二个解释,它说 2 行,但示例中只有 1 行)