使用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条件的索引(通常不仅仅是我上面显示的两个条件),或者如何重构我的查询以使用我的索引?或者还有另一种优化方法吗?
谢谢。
答案 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);