繁体   English   中英

如何在WHERE子句中使用LIMIT优化通配符查询

[英]How to optimize a query with wildcards in WHERE clause with LIMIT

目前,我有这个查询

SELECT field1 FROM table1 
WHERE field1 LIKE '%foo%' 
LIMIT 20

进行以下查询更有效吗?

SELECT field1 FROM table1 
WHERE 
field1 LIKE 'foo'  OR 
field1 LIKE 'foo%' OR 
field1 LIKE '%foo%' 
LIMIT 20

SQL版本 (抱歉,我之前应该提到过)

在共享主机上带有innoDB引擎的MySQL 5.5。 使用此配置,我无法使用FULLTEXT索引(innoDB上的MySQL v5.6提供了全文索引

我的详细目标

我需要找到20条包含一个单词的记录。 在大多数情况下,单词会与字段中的值完全匹配,即参见表:

|  **field1**  |  **search**  |
|    record1   |    foo       |
|    record2   |    fooziness |
|    record3   |    other1    |
|    record4   |    foo       |
|    record5   |    other2    |
|      ...     |      ...     |

我知道'word''word%'使用INDEX,而最后一个'%word%'不使用。

查询优化器是否会首先尝试查找带有'word''word%'记录,并在找到20个'word'情况下保存对'%word%'的无效搜索?

对于您而言,这比我们进行测试要容易得多-尤其是因为实际查询可能比您显示的复杂得多。

然而...

根据手册 ,限制可以优化查询,但是大多数情况下使用order by时。 这是有道理的,因为可能会有多个“ where”子句,而limit子句不一定会知道哪些子句受limit子句的影响。

我通过执行以下操作欺骗了类似的查询:

( SELECT field1, 1 as quality FROM table1 
    WHERE field1 = 'foo'  
) union
( SELECT field1, 2 as quality FROM table1 
    WHERE field1 LIKE 'foo%'
) union
( SELECT field1, 3 as quality FROM table1 
    WHERE field1 LIKE '%foo%'
)    
order by quality 
LIMIT 20

它的可读性差很多,但是一旦发现20条记录,优化器就诱使优化器放弃查询。 不确定是否可以继续使用。

当然,如果性能对您很重要,则使用MySQL 全文搜索会更快,并且更不易碎。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM