MySQL' OR'在' WHERE'导致'使用filesort'

时间:2015-01-27 05:49:10

标签: mysql

使用where'来解析以下查询结果。 (据我所知,这是好的):

EXPLAIN SELECT niid
FROM news 
FORCE INDEX (ticker_market_date)
WHERE (ticker = "abcd" AND market = "") 
ORDER BY date DESC

但是,如果我添加一个' OR'条款到我的' WHERE',我得到'使用filesort':

EXPLAIN SELECT niid
FROM news 
FORCE INDEX (ticker_market_date)
WHERE (ticker = "abcd" AND market = "") 
OR (ticker = "abcd" AND market = "ef")
ORDER BY date DESC

如何创建一个允许多个OR条件的索引(通常不仅仅是我上面显示的两个条件),或者如何重构我的查询以使用我的索引?或者还有另一种优化方法吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

假设您的索引ticker_market_date位于(ticker, market, date),并且假设ticker = "abcd" AND market in ("", "ef")仍具有高度选择性,则似乎MySql可能会获得query plan wrong - {{1}这是一个常见的罪魁祸首。您可以尝试嵌套查询,以便最后应用ORDER BY - 这应该允许您删除ORDER BY。如果所有过滤谓词都具有相同的形式,您也可以将它们清理为FORCE INDEX语句,尽管这是为了提高可读性并且对性能没有影响:

IN

答案 1 :(得分:0)

您需要一个涵盖OR所有子表达式中所有列的索引。对于您发布的查询,您需要:

ALTER TABLE news ADD INDEX (ticker, market);