我有两个大型列表(可能是一亿个项目),每个列表的源可以是数据库表或平面文件。这两个列表都具有相似的大小,都是未分类的。我需要找到它们之间的区别。所以我有3个场景:
1. List1是一个数据库表(假设每行只有一个项目(key)是一个字符串),List2是一个大文件。
2.两个列表都来自2个数据库表
3.两个列表都来自两个文件。
在案例2中,我打算使用:
select a.item from MyTable a where a.item not in (select b.item form MyTable b)这显然效率低下,还有更好的方法吗?
另一种方法是:
我计划对每个列表进行排序,然后沿着它们走下去找到差异。如果列表来自文件,我必须首先将其读入db表,然后使用db排序输出列表。数据库排序中的运行时复杂度是否仍为O(nlogn)?
任何一种方法都是一种痛苦,当涉及的清单中有数亿件物品时,这种方法似乎会很慢。有什么建议?
答案 0 :(得分:1)
以下内容可能比NOT IN快(但要测试一下):
从MyTable中选择a.item a LEFT JOIN MyTable B ON A.JoinColumn = B.JoinColumn B.JoinColumn IS NULL
确保您的JoinColumns已编入索引。索引将使排序的整个问题变得糟糕。
答案 1 :(得分:1)
这不是一个真正的数据库问题。
步骤1.将两个列表排序。也许数据库列表已经排序,但如果没有,则按排序顺序导出,或者如果需要多次排序,则创建一个索引。
步骤2.使用排序实用程序在文本文件中生成列表的排序副本。如果这些列表超出了UNIX排序实用程序的功能,请将它们分解,对每个列表进行排序,并在应用程序中包含这些列表的合并。
步骤3.编写应用程序以对两个列表应用合并算法,并以这种方式识别差异。请注意,如果文本文件是多个块,则需要辅助合并算法以按排序顺序提供主算法。
请注意,如果您无法使用UNIX或Linux对文本文件进行排序,请获取UNIX排序命令的源代码并将其移植到您的操作系统。 This article explains why.