0

我有一个快速且非常简单的问题。

我有一个带有以下 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。

如果有人能对此有所了解,将不胜感激!谢谢!!

4

2 回答 2

1

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

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

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

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

于 2012-11-21T09:04:13.957 回答
0

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

第二个查询使用两个键。

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

于 2012-11-21T08:44:20.343 回答