Mysql

在 OR 查詢上強制 MySQL 索引?

  • June 17, 2021

我有一個查詢可以使用索引在 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.

(我不知道是否有更簡單的方法,但我確信這會奏效。)

如果idPRIMARY 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;

引用自:https://dba.stackexchange.com/questions/294343