[英]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.