“WHERE ... IN ...”,“WHERE ...!= ...”查询索引问题

时间:2011-11-17 14:20:15

标签: mysql sql database indexing

我正在使用 MySQl 数据库。

我知道如果为列创建索引,使用该列索引查询表中的数据会很快。但是,我仍然有以下问题:

(假设我有一个名为 cars 的表,有一个名为 country 的列,我为 country 列创建了索引)< / p>

  1. 我知道例如,查询SELECT * FROM cars WHERE country='japan'将使用列 country 上的索引来查询快速的数据。 !=操作怎么样? SELECT * FROM cars WHERE country!='japan';还会使用索引查询数据吗?

  2. WHERE ... IN ...操作是否使用索引查询数据?例如SELECT * FROM cars WHERE country IN ('japan','usa','sweden');

4 个答案:

答案 0 :(得分:3)

一般的答案是:这取决于。这取决于数据库优化器认为是检索数据的最佳方式,并且可能需要对数据进行分配。

例如,如果99%的行都有country ='japan',则第一个查询(=)可能不会使用索引,但!=的国家/地区将使用该索引。< / p>

答案 1 :(得分:2)

您可以使用EXPLAIN SELECT查看您的查询是否使用了索引。

例如:

EXPLAIN SELECT * 
FROM A 
WHERE foo NOT IN (1,4,5,6);

可能产量:

+----+-------------+-------+------+---------------
| id | select_type | table | type | possible_keys 
+----+-------------+-------+------+---------------
|  1 | SIMPLE      | A     | ALL  | NULL          
+----+-------------+-------+------+---------------

+------+---------+------+------+-------------+
| key  | key_len | ref  | rows | Extra       |
+------+---------+------+------+-------------+
| NULL | NULL    | NULL |    2 | Using where |
+------+---------+------+------+-------------+

在这种情况下,查询没有possible_keys,因此不使用key来执行查询。这是您感兴趣的key列。

此处提供更多信息:

答案 2 :(得分:0)

使用'EXPLAIN'查看您的查询会发生什么。您可能会对'possible_keys'和'key'列感兴趣。

EXPLAIN SELECT * FROM CARS WHERE `country` != 'japan'

答案 3 :(得分:-1)

两个查询都将使用索引(假设索引为country,因为它是第一列)

如果有疑问,请使用EXPLAIN。您还需要阅读(至少部分)this