我正在处理 db 中的大量行(MySQL,innoDb 引擎,大约 2000 万行),我需要执行很多模糊搜索。出于某些原因,我决定使用 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 秒