在20万行MySQL数据库中计算成对比较的最快方法

1 投票
2 回答
1157 浏览
提问于 2025-04-17 13:51

我在一个MySQL数据库里存了20万个列表。现在,我有一个列表A,我需要计算这个列表A和这20万个列表中每一个列表X的相似度分数。假设我们用的相似度计算方法很简单,比如看A和X中有多少个相同的元素。

因为是逐对比较,我想不出有什么办法能让这个过程比O(N)更快,所以要提高运行速度就得利用多个CPU核心。目前我把这个任务分配到4个核心上,用的是多线程池,但即便如此,完成这个任务还是要将近10分钟。更糟糕的是,我的电脑为了保护自己会自动关机。

如果你之前遇到过类似的问题,有没有什么其他的方法可以分享一下?

2 个回答

0

假设你的列表表格看起来像这样:

LISTID LISTITEM
1      1
1      2
1      3
2      2
2      4
2      5

如果列表 A 比如是 [1,2],你可以用 SQL 这样来操作:

SELECT LISTID, COUNT(*)
FROM T
WHERE LISTITEM IN (1,2)
GROUP BY LISTID
0
def bestmatch(A, lists):
     a = set(A)
     return min(lists, key=lambda x:  len(set(x) & a)

使用 min 可以让循环的速度达到C语言的水平。lambda 是一种闭包,它可以快速引用 a。而 set(A) 这一步只计算一次,而不是在内层循环中重复计算。

撰写回答