2

私がこれをするとします:

SELECT * FROM table WHERE field2 = '2019@162440' OR field2 LIKE '%%2019@%%';

この場合、両方field2 = '2019@162440'field2 LIKE '%%2019@%%'条件の一致を実行しようとします (つまり、これらの条件に一致する行を検索するため、一致する行が既に見つかった場合でも、両方の条件に一致する行を見つけようとすると、さらに計算能力が必要になりますfield2 = '2019@162440') 。

field2 LIKE '%%2019@%%'クエリがより効率的になるように、条件field2 = '2019@162440'が何にも一致しない 場合にのみ実行を試みるようにクエリを再構成することにより、mysqlに指示する方法はありますか?

すなわち。field2 LIKE '%%2019@%%'基本的に、一致する行がない場合にのみ、mysql が一致する行を見つけようとするようにしますfield2 = '2019@162440'。一致する行field2 = '2019@162440'が見つかった場合、一致しようとしないでくださいfield2 LIKE '%%2019@%%'

また、サブクエリはありません

4

2 に答える 2

1

まず、私は MySQL の専門家ではありません。他のいくつかの DBMS ほど最適化されていないため、次のクエリは実際には実行時間を短縮しない可能性があります。しかし、それは一見の価値があります...

インデックスが作成されている場合field2、これは非常に高速なソリューションになる可能性があります。

-- Get results where field2 = '2019@162440'
SELECT  *
FROM    table
WHERE   field2 = '2019@162440'
-- Append...
UNION
-- Get results where field2 LIKE '%%2019@%%' but only
-- if there are no rows where field2 = '2019@162440'
SELECT  *
FROM    table
WHERE   NOT EXISTS(
            SELECT  *
            FROM    table
            WHERE   field2 = '2019@162440'
        )
    AND field2 LIKE '%%2019@%%'

最速のクエリを実行し、すべての結果を選択します。次に、EXISTS を含む 2 番目の遅いクエリを追加します。サブクエリに行が含まれている場合、EXISTS 句は true を返します。これにより、2 番目のクエリ全体がショートサーキットされ、実行されなくなります (したがって、0 行が追加されます)。ただし、最初のクエリが 0 行を返す場合、2 番目のクエリが開始され、低速のLIKE比較が実行されます。

于 2013-10-10T17:31:10.443 に答える