我正在使用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秒