我有一个这样的查询:
( SELECT * FROM mytable WHERE author_id = ? AND seen IS NULL )
UNION
( SELECT * FROM mytable WHERE author_id = ? AND date_time > ? )
Run Code Online (Sandbox Code Playgroud)
我还有这两个索引:
(author_id, seen)
(author_id, date_time)
Run Code Online (Sandbox Code Playgroud)
我在某处读到:
WHERE一个查询在处理子句时一般每个表只能使用一个索引
正如您在我的查询中看到的,有两个单独的WHERE子句。所以我想知道,“每个表只有一个索引”意味着我的查询只能使用这两个索引之一,或者它可以为每个子查询使用这些索引之一并且这两个索引都有用?
换句话说,这句话是真的吗?
“总是会使用其中一个索引,而另一个则无用”
关于仅使用一个索引的说法对于 MySQL 来说不再正确。例如,它实现了索引合并优化,可以利用某些where具有or. 这是文档中的描述。
您应该尝试这种形式的查询,看看它是否使用索引 mer:
SELECT *
FROM mytable
WHERE author_id = ? AND (seen IS NULL OR date_time > ? );
Run Code Online (Sandbox Code Playgroud)
这应该比union版本更有效,因为它不会产生删除重复项的开销。
此外,根据数据的分布,上述带有索引的查询mytable(author_id, date_time, seen)可能与您的版本一样好或更好。