我正在开发一个涉及数据集之间连接的项目,我们要求允许预览任意数据集之间的任意连接。这很疯狂,但这就是为什么它的乐趣。这是使用面对所以给定一个连接我想快速显示~10行结果。
我一直在以不同的方式进行实验,以不同的方式对不同的表进行子采样,以至于我得到至少一些结果行,但保持样本足够小以使连接快速并且不会导致采样到很贵。
以下是我通过气味测试发现的方法。我想了解一些关于它们的事情:
采用一个数据集的随机样本来减小总体大小。
SELECT col1, col2 FROM table1 JOIN
(SELECT col1, col2 FROM table2 LIMIT #) AS sample2
on table1.col1 = sample2.col1
LIMIT 10;
我喜欢这个,因为它很容易,未来有可能明智地从哪个表中抽样。也可以选择table1.col1永远不等于sample2.col1的部分,这样就不会返回任何结果。
更复杂的多查询方法。在这里,我将对要连接的列进行明确选择,比较结果以查找常用值,然后执行子选择,将结果限制为常用值。
SELECT DISTINCT col1 FROM table1;
SELECT DISTINCT col1 FROM table2;
commonVals = intersection of above results
SELECT col1, col2 FROM table1 JOIN
(SELECT col1, col2 FROM table2 WHERE col1 IN(commonVals) LIMIT #) as sample2
on table1.col1 = sample2.col1
LIMIT 10;
这为我们提供了一个很好的table2示例,但是select distinct查询可能比join更昂贵。我相信如果你知道不同的cals需要多长时间,可能有办法确定这种方法是否更快,但此时我们对数据集知之甚少。
这是最容易的,也是我倾向于的。
SELECT col1, col1 FROM table1 join table2 on table1.col1 = table2.col1 LIMIT #
假设连接良好,这将始终返回数据,并且至少在很多情况下它将快速执行。
答案 0 :(得分:0)
第一种方法的问题是第一个表中的行可能在第二个表中没有匹配项。记住,内部联接不仅可以进行匹配,还可以进行过滤。
如果用于连接的所有列都有索引,则第二种方法可以工作。然后,您可以通过执行以下操作来获取匹配ID的列表:
where id in (select id from table1) and id in (select id from table2) . . .
这摆脱了初始代码,应该非常快。
第三种方法是最直接地使用数据库的功能。您将依赖于MySQL根据结果集的大小进行优化的能力。这是它所做的事情,至少在理论上是这样。
我强烈建议将第三种方法与连接中使用的列的索引结合使用。这需要对查询进行最少的更改(只需添加limit
子句)。如果合适,它允许数据库进行额外的优化。它适用于更一般的查询集。