查询只能为每个表使用一个索引吗?

时间:2016-06-11 15:11:46

标签: mysql sql

我有这样的查询:

( 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子句。所以我想知道,"每个表只有一个索引" 意味着我的查询只能使用这两个索引中的一个,或者它可以为每个子查询和两个索引使用其中一个索引有用吗?

换句话说,这句话是真的吗?

"总是会使用其中一个索引,而另一个索引是无用的"

4 个答案:

答案 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

http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html