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

时间:2017-06-21 14:09:55

标签: mysql optimization query-optimization

目前,我有这个查询

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 VERSION (抱歉,我之前应该提到)

MySQL 5.5与共享主机上的innoDB引擎。使用此配置,我无法使用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'的低效搜索?

1 个答案:

答案 0 :(得分:3)

这对您来说比我们更容易回答 - 特别是因为实际查询可能比您显示的要复杂得多。

...然而

根据manual,限制可以优化查询,但主要是在使用order by时。这是有道理的,因为它可能会有多个"其中"条款和限制条款不一定知道哪些条款受到限制条款的影响。

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

( 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 Full text searching要快得多,而且要脆弱得多。