Mysql
在 OR 查詢上強制 MySQL 索引?
我有一個查詢可以使用索引在 99% 的時間內解決,但需要對一些查詢進行表掃描:
SELECT * FROM mytable WHERE idx=123 OR name like "%foo%" limit 1
邏輯上只能有一個匹配,並且
LIMIT 1
那裡讓 MySQL 知道它可以在找到一個時停止搜尋。因此,當它有一個索引匹配時,MySQL 可以停止評估查詢,就像它在執行LIKE
部分時所做的一樣。即使在找到一個項目並
EXPLAIN
確認 MySQL 5.7 始終在執行表掃描的情況下,執行時間也遠高於正常索引查找。我試圖添加一個
FORCE INDEX(primary)
,但這沒有幫助。不幸的是,我這需要在單個查詢中完成(從只允許單個查詢的應用程序中執行)。
任何想法如何加快在索引中找到項目的查詢?
訣竅是強制優化器避免評估
OR
.(我不知道是否有更簡單的方法,但我確信這會奏效。)
如果
id
是PRIMARY KEY
:SELECT * FROM mytable WHERE id = IF ( EXISTS( SELECT id FROM mytable WHERE idx = 123 ), ( SELECT id FROM mytable WHERE idx = 123 LIMIT 1 ), ( SELECT id FROM mytable WHERE name LIKE "%foo%" LIMIT 1 ) );
嘗試下一個查詢(我假設它
mytable.idx
已被索引):( SELECT * FROM mytable WHERE idx=123 LIMIT 1) UNION ALL ( SELECT * FROM mytable WHERE name like '%foo%' AND NOT EXISTS ( SELECT NULL FROM mytable WHERE idx=123 ) LIMIT 1) LIMIT 1;