mysql索引用于OR查询



我有一个这样的查询:

SELECT account.name, address.first_line 
FROM account
JOIN address ON address.id = account.address_id
WHERE
( account.date_updated >= '2016-05-05 12:00:00' 
OR
address.date_updated >= '2016-05-05 12:00:00' )

用户表和地址表在各自的"date_updated"列上都有索引,但当我解释时,这两个索引都没有使用。

有什么办法改变这一点吗?或者,我只需要运行两个单独的查询,就可以获得所需的索引信息。

我认为这与这个问题不同:MySQL:如何索引一个";OR";子句,因为"OR"两边的字段来自不同的表,所以您不能对它们设置复合索引。

数据库很难优化OR。一种方法是使用UNIONUNION ALL:

SELECT a.name, ad.first_line 
FROM account a JOIN
     address ad
     ON ad.id = a.address_id
WHERE a.date_updated >= '2016-05-05 12:00:00' 
UNION ALL
SELECT a.name, ad.first_line 
FROM account a JOIN
     address ad
     ON ad.id = a.address_id
WHERE ad.date_updated >= '2016-05-05 12:00:00' AND
      a.date_updated < '2016-05-05 12:00:00'

您可以使用UNION而不是UNION ALL编写此查询,并省略NOT EXISTS子句。然而,UNION中的重复消除通常比使用WHERE子句仅消除可能的重复要慢。

MySQL不为包含ORWHERE子句使用索引。此问题提供了更多信息。MySQL WHERE子句文档。

我会试着像一样把两者结合在一起

SELECT account.name, address.first_line FROM account 
JOIN address ON address.id = account.address_id 
WHERE account.date_updated >= '2016-05-05 12:00:00'
UNION
SELECT account.name, address.first_line FROM account 
JOIN address ON address.id = account.address_id 
WHERE address.date_updated >= '2016-05-05 12:00:00'

最新更新