MySQL EXPLAIN语句显示ALL类型

时间:2012-11-21 08:38:13

标签: mysql indexing explain

我有一个快速而简单的问题。

我有一个包含以下SQL的表:

CREATE TABLE `users` (
 `id` int(20) NOT NULL AUTO_INCREMENT,
 `username` char(100) NOT NULL,
 `password` char(100) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `password` (`password`),
 KEY `username_2` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

当我尝试运行EXPLAIN语句时如下:

EXPLAIN SELECT * FROM users WHERE username = 'xx' OR `password` = 'xx'

我收到的结果显示我有type = ALL

但是,当我尝试运行EXPLAIN语句时:

EXPLAIN SELECT * FROM users WHERE username = 'xx' AND `password` = 'xx'

我收到的结果显示我有type = REF

我想我的问题是为什么第一个查询显示ALL而第二个查询显示REF。

如果有人能够了解这一点,我们非常感谢!谢谢!!

2 个答案:

答案 0 :(得分:1)

MySQL无法优化OR条件。因此,即使索引可以满足OR的两个部分,它也不会使用它们。

您应该可以使用UNION解决此问题:

SELECT * FROM users WHERE username = 'xx'
UNION
SELECT * FROM users WHERE password = 'xx'

每个子查询都可以使用索引,然后合并结果。

答案 1 :(得分:0)

ALL表示必须扫描整个表格。在这种情况下,密码和用户名的索引没有帮助(“(用户名,密码)”没有键。)

第二个查询使用两个键。

可在此处找到更详细的说明:http://dev.mysql.com/doc/refman/5.1/en/explain.html