我正在使用 MySQl 数据库。
我知道如果为列创建索引,使用该列索引查询表中的数据会很快。但是,我仍然有以下问题:
(假设我有一个名为 cars 的表,有一个名为 country 的列,我为 country 列创建了索引)< / p>
我知道例如,查询SELECT * FROM cars WHERE country='japan'
将使用列 country 上的索引来查询快速的数据。 !=
操作怎么样? SELECT * FROM cars WHERE country!='japan';
还会使用索引查询数据吗?
WHERE ... IN ...
操作是否使用索引查询数据?例如SELECT * FROM cars WHERE country IN ('japan','usa','sweden');
答案 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)