0

我正在处理 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 秒

4

0 回答 0