MySQL字符串搜索和where子句条件顺序

时间:2013-01-25 11:03:18

标签: mysql sql string fuzzy-search

我正在使用db中的大量行(MySQL,innoDb引擎,大约20万行),我需要执行类似搜索的模糊操作。出于某些原因,我决定使用jaro_winkler算法,并且出于性能问题,我将其作为SQL中的函数实现。应用程序是用Python编写的,我今天遇到了一个奇怪的情况:

比较这两个查询(从mysql shell调用而不是通过Orm等):

SELECT * FROM products WHERE jaro_winkler(code, '78-1747') > 0.7 AND code LIKE '%78%';

SELECT * FROM products WHERE code LIKE '%78%' AND jaro_winkler(code, '78-1747') > 0.7;

我注意到第一个比第二个慢至少10倍。一开始似乎合乎逻辑,但是当我检查WHERE中的条件顺序时无关紧要。

所以我的问题 - 这是正常行为吗?

有人(从实践经验)可以推荐最佳算法或功能来执行模糊搜索吗?我知道damerau-levenshtein度量标准,但它变得比我目前的解决方案慢。

编辑: 使用说明后:

我非常快速地创建了示例数据库,并使用了两个查询:

第一个查询:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1       SIMPLE      products        ALL     NULL    NULL    NULL    NULL    4166    Using where

查询时间:~2秒

解释第二个查询:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1       SIMPLE      products        ALL     NULL    NULL    NULL    NULL    4332    Using where

查询时间:~0.1秒

0 个答案:

没有答案