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

标签 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 索引(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/

相关文章:

mysql find_in_set匹配2列

mysql - 查找一行和多行之间的相似性

MySql CREATE TRIGGER INSERT 也获取刚刚插入的 MAX PK id 吗?

php - 如何在 Laravel 5 的关系查询中使用 hasRole() 过滤用户?

C 根据优化级别给出不同的输出(新示例)

mysql - 如何优化mysql 5.5存储过程

MySQL查询优化总..案例

scala - 关于优化简单的 Scala FoldLeft 多个值的建议?

algorithm - 在特定范围内查找两个大向量中元素之间的差异值并将其合并(对于 bsxfun 而言太大)

mysql 使用内部连接优化查询 where 和 order by 和 co-ordinates