我有这样的查询:
( SELECT * FROM mytable WHERE author_id = ? AND seen IS NULL )
UNION
( SELECT * FROM mytable WHERE author_id = ? AND date_time > ? )
我也有这两个索引:
(author_id, seen)
(author_id, date_time)
我在某处读到:
在处理
时,查询通常只能为每个表使用一个索引WHERE
子句
正如您在我的查询中看到的,有两个独立的WHERE
子句。所以我想知道,"每个表只有一个索引" 意味着我的查询只能使用这两个索引中的一个,或者它可以为每个子查询和两个索引使用其中一个索引有用吗?
换句话说,这句话是真的吗?
"总是会使用其中一个索引,而另一个索引是无用的"
答案 0 :(得分:2)
UNION
结合了子查询的结果。每个子查询将独立于其他子查询执行,然后将合并结果。因此,在这种情况下,WHERE
限制应用于每个子查询,而不是所有联合结果。
回答你的问题:是的,每个子查询都可以使用一些索引。
答案 1 :(得分:2)
关于仅使用一个索引的声明不再适用于MySQL。例如,它实现了索引合并优化,它可以利用具有where
的某些or
子句的两个索引。 Here是文档中的描述。
您应该尝试这种形式的查询,看看它是否使用索引mer:
SELECT *
FROM mytable
WHERE author_id = ? AND (seen IS NULL OR date_time > ? );
这应该比union
版本更有效,因为它不会产生删除重复项的开销。
此外,根据您的数据分布情况,上面带有mytable(author_id, date_time, seen)
索引的查询可能会比您的版本更好或更好。
答案 2 :(得分:1)
有些情况下数据库引擎可以为一个select语句使用更多索引,但是在过滤一组行时实际上是不可能的。如果要对两列使用索引,则在两列上构建一个索引而不是两个索引。
答案 3 :(得分:1)
每个子查询或复合查询的一部分本身是一个查询,可以作为单一查询进行性能和索引访问评估..你也可以强制使用不同的索引进行eahc查询..在你的情况下你使用的是union和这些是两个分开的查询..联合在一个结果查询中 。你可以在这个指南中有一个简短的指导如何使用mysql ue index .. acccessing