我有这样的查询:
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"两侧的字段来自不同的表格,所以你不能在它们上面加上综合索引。
答案 0 :(得分:1)
数据库很难优化OR
。一种方法是使用UNION
或UNION 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