我有一个快速而简单的问题。
我有一个包含以下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。
如果有人能够了解这一点,我们非常感谢!谢谢!!
答案 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