目前,我有这个查询
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'
的低效搜索?
答案 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要快得多,而且要脆弱得多。