MySQL EXPLAIN语句显示类型上的所有

MySQL EXPLAIN语句显示类型上的所有,mysql,indexing,explain,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 A

我有一个简单的问题

我有一个包含以下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 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


如果有人能解释这一点,我们将不胜感激!谢谢

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

第二个查询使用两个键


这里可以找到更详细的解释:

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

您应该能够通过使用联合来解决此问题:

SELECT * FROM users WHERE username = 'xx'
UNION
SELECT * FROM users WHERE password = 'xx'
每个子查询都可以使用索引,然后合并结果