带OR的查询的mysql索引用法

时间:2016-05-09 21:48:20

标签: mysql sql select indexing

我有这样的查询:

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: how to index an "OR" clause因为" OR"两侧的字段来自不同的表格,所以你不能在它们上面加上综合索引。

2 个答案:

答案 0 :(得分:1)

数据库很难优化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子句删除可能的重复项要慢。

答案 1 :(得分:0)

MySQL不对其中包含WHERE的{​​{1}}子句使用索引。 This question有更多信息。 MySQL WHERE clause documentation

我会尝试将两者合并在一起,如

OR