2012-11-21 51 views
0

我有一个快速而非常简单的问题。MySQL 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结果。

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

如果有人能说明这一点,非常感谢!谢谢!!

回答

1

MySQL是不是能够优化OR条件。因此,尽管OR的两个部分都可以通过索引来满足,但它不会使用它们。

您应该能够通过使用UNION来解决这个问题:

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

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

0

所有的意思是,整个表必须被扫描。在这种情况下,密码和用户名的索引不起作用(“(用户名,密码)”上没有键)。

第二个查询使用两个键。

更详细的解释可以在这里找到:http://dev.mysql.com/doc/refman/5.1/en/explain.html