Php 为什么带有“或”的示例查询不使用索引?

Php 为什么带有“或”的示例查询不使用索引?,php,mysql,sql,Php,Mysql,Sql,我在读mysql 以下是手册中的一个示例 该示例创建了多个列索引,索引是last\u name,first\u name 手册上说这个查询将使用索引 SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael'; 但具有或低于的查询将不使用索引: SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael'; 问题 为什么使用或

我在读mysql

以下是手册中的一个示例

该示例创建了多个列索引,索引是last\u name,first\u name

手册上说这个查询将使用索引

SELECT * FROM test
  WHERE last_name='Widenius' AND first_name='Michael';
但具有或低于的查询将不使用索引:

SELECT * FROM test
  WHERE last_name='Widenius' OR first_name='Michael';
问题 为什么使用或进行示例查询,即为什么

SELECT * FROM test
      WHERE last_name='Widenius' OR first_name='Michael';

不要使用索引?

只要说数据库不善于优化WHERE子句中的OR IN或not IN条件就足够了

从高层次上讲,我可以将原因描述如下。当条件是连接和使用时,第一种方法会缩小第二种方法使用的人口。这使得索引可行,因为条件嵌套。使用或时,条件是独立的。我应该注意到,一些数据库可以比其他数据库更好地处理或处理这些条件

如果希望代码使用索引,可以使用UNION ALL:


为了获得最佳性能,您需要在testlast_name和testfirst_name、last_name上建立索引。

您可以通过显示执行计划来证明这一点吗?但是,名称索引不用于以下查询中的查找:选择*FROM test,其中last_name='wideius'或first_name='Michael'@手册上说
SELECT * FROM test
      WHERE last_name='Widenius' OR first_name='Michael';
SELECT t.*
FROM test t
WHERE last_name = 'Widenius'
UNION ALL
SELECT t.*
FROM test t
WHERE last_name <> 'Widenius' AND first_name = 'Michael';