2013-10-10 60 views
2

想我这样做:MySQL的后备WHERE语句

SELECT * FROM table WHERE field2 = '[email protected]' OR field2 LIKE '%%[email protected]%%'; 

在这种情况下,它会尝试执行两个field2 = '[email protected]'field2 LIKE '%%[email protected]%%'条件(即,它会搜索匹配,因此这些条件需要行匹配一些更多的计算能力,试图找到行匹配两个条件,即使它已经发现了一排匹配field2 = '[email protected]'

有没有办法通过改革查询才指示MySQL的尝试执行field2 LIKE '%%[email protected]%%'如果条件field2 = '[email protected]'不匹配任何事都可以查询变得更高效

IE。我基本上希望mysql只尝试找到匹配field2 LIKE '%%[email protected]%%'的行,只有当没有行匹配field2 = '[email protected]'。如果找到完全匹配的行field2 = '[email protected]',不要试图去匹配field2 LIKE '%%[email protected]%%'

此外,没有子查询

+0

这是否工作:'SELECT * FROM table WHERE field2 ='2019 @ 162440'OR(field2!='2019 @ 162440'AND field2 LIKE'%% 2019 @ %%');' –

+0

它会返回相同的 – AdrianBR

+0

@AdrianBR是的,但会保持mysql做这两个检查?我在这里问,我不知道。 –

回答

1

让我首先说我不是MySQL的专家。它不像其他一些DBMS那样优化,所以下面的查询可能不会真正减少执行时间。但它是值得一试...

如果field2被索引,这可能是一个非常快速的解决方案:

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

你要运行最快的查询和选择所有结果。然后,追加包含EXISTS的第二个较慢的查询。如果子查询包含任何行,则EXISTS子句将返回true,这些行应将整个第二个查询短路并防止其运行(因此附加0行)。但是,如果第一个查询返回0行,则第二个查询将启动并运行较慢的LIKE比较。