2

假设我这样做:

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

在这种情况下,它将尝试执行 BOTHfield2 = '2019@162440'field2 LIKE '%%2019@%%'条件的匹配(即,它将搜索与这些条件匹配的行,因此即使它已经找到了匹配的行,它也需要更多的计算能力来尝试找到匹配这两个条件的行field2 = '2019@162440'

field2 LIKE '%%2019@%%'有没有办法通过将查询改组为仅在条件field2 = '2019@162440'不匹配任何内容 时才尝试执行来指示 mysql,从而使查询变得更有效

IE。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 的查询。如果子查询包含任何行,则 EXISTS 子句将返回 true,这会使整个第二个查询短路并阻止其运行(因此追加 0 行)。但是,如果第一个查询返回 0 行,那么第二个查询将启动并运行较慢的LIKE比较。

于 2013-10-10T17:31:10.443 回答
0

我能做的最好的就是将 FOUND_ROWS() 函数与 UNION 一起使用:

SELECT *  
FROM t  
WHERE field2 = '2019@162440'

UNION ALL

SELECT *  
FROM t   
WHERE FOUND_ROWS() = 0 
      AND field2 LIKE '%%2019@%%'

SQL 小提琴演示

于 2013-10-10T17:08:29.397 回答