2012-01-24 46 views
3

有谁知道MySQL的解释输出

之间的区别使用索引

使用其中;使用索引

mysql的解释输出(在额外)?

繁殖:

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)从tmp_t1其中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>从tmp_t1其中b(1)解释选择计数='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) 

有没有人知道为什么在第一种情况下re只是在额外的领域使用索引,而在第二个是“使用where;使用索引”? 这两种情况之间的区别在于第一种情况在整数上运行WHERE,第二种情况在varchar(50)字段上执行。 但它为什么重要?

感谢您的帮助!

+0

'使用where'说,有一个过滤器(='WHERE'条款),在SQL。 '使用索引'表示查询使用索引。两者都是不同的东西。我不明白这个问题。 – Kaii

+0

问题是mysql为什么只使用索引来执行第一个查询,而为了执行查询第二个“使用where”被报告。我问,因为我无法理解这两个查询之间的区别 - 一个使用在条件的整数,而另一个为varchar字段的事实如何影响MySQL的方式执行这些(为什么第二个查询不使用“index only”?) –

+0

在第一个EXPLAIN中提到并实际使用的'kz'索引是什么? – newtover

回答

3

我应确认的区别是非常混乱确实如此。在其他情况下,Using where; Using index可能表示索引已被使用,但已完整扫描。就像你在(a,c)上有一个复合索引,但是查询如SELECT a FROM thetable WHERE c = 1一样。在这种情况下,MySQL将使用索引(因为它包含了所有必要的数据并且在内存中),但是会对索引执行完整扫描。

至于导致你应该看到,在

SHOW STATUS LIKE 'Handler_read_next'; 

变量将增加至数表中的行的。

但是,这不是为查询的情况:

select count(*) from tmp_t1 where b='b1'; 

它检查索引列的确切人数。我认为这是某种错误或特征,还有一个证据表明,结果EXPLAIN本身并不是什么依赖的东西。有趣的是,查询大型表的,用综合指数在VARCHAR是第二个索引EXPLAIN有时不显示Using where。我很困惑。

+0

感谢您介绍'Handler_read_ *'状态变量的世界。 –

0

使用凡

甲WHERE表达(在附加到可能的键查找)用于检查是否该行应该被接受。如果你没有与所有的连接类型一起使用'Where',你可能做错了!

使用索引

仅索引用于从表中检索所需的信息。没有必要执行额外的查找来检索实际记录。

+0

我没有JOIN,只有一个简单的条件(我在上面的原始问题中添加了schema和sql命令)。 –

+0

那么只有第一部分是适用于WHERE表达(在附加到可能的键查找)用于检查是否该行应该被接受您的explain输出即 甲。 –

0

“使用索引”意味着只有索引用于执行实际查询(查找要返回的行),这意味着mysql不需要读取实际的行。

列信息从利用在索引树仅 信息的表中检索,而不必做额外寻求 读取实际行。当查询仅使用 列作为单个索引的一部分时,可以使用此策略。

“使用,其中”意味着做数据查找时(它需要返回行,找到你所选择的列中的相应数据)

如果额外列的索引也使用还说在哪里使用,这意味着索引是 用于查找关键值。不使用其中的 优化可读取索引,以避免读取数据行,但不 用它来查找。例如,如果索引是查询的覆盖索引 ,那么优化程序可以扫描它而不用它进行查找。

Source in mysql's documentation(搜索“使用索引”)