目前,我有这个查询
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 索引(Fulltext Index 可从 innoDB 上的 MySQL v5.6 获得)
我的详细目标
我需要找到 20 条包含单词的记录。大多数情况下,该词将与字段中的值完全匹配,即见表:
| **field1** | **search** |
| record1 | foo |
| record2 | fooziness |
| record3 | other1 |
| record4 | foo |
| record5 | other2 |
| ... | ... |
我知道 'word'
或 'word%'
使用索引,而最后一个 '%word%'
不使用。
查询优化器是否会首先尝试查找包含'word'
或'word%'
的记录并保存对'%word%' 的低效搜索
如果找到 20 个 'word'
?
最佳答案
这对您来说测试比我们回答要容易得多 - 特别是因为实际查询可能比您显示的要复杂得多。
然而...
根据manual , limit 可以优化查询,但主要是在使用 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 Full text searching速度更快,也更不脆弱。
关于mysql - 如何使用 LIMIT 优化 WHERE 子句中的通配符查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44678515/