预览MySQL连接的快速方法是什么?

时间:2013-02-22 19:46:03

标签: mysql sql optimization join

我正在开发一个涉及数据集之间连接的项目,我们要求允许预览任意数据集之间的任意连接。这很疯狂,但这就是为什么它的乐趣。这是使用面对所以给定一个连接我想快速显示~10行结果。

我一直在以不同的方式进行实验,以不同的方式对不同的表进行子采样,以至于我得到至少一些结果行,但保持样本足够小以使连接快速并且不会导致采样到很贵。

以下是我通过气味测试发现的方法。我想了解一些关于它们的事情:

  1. 哪些类型的连接或数据集会失败?
  2. 我如何识别这些数据集?
  3. 如果这两件事情都不好,那怎么可以改进呢?
  4. 是否有一种我没有放在这里的样品更好?
  5. 具有限制的子选择。

    采用一个数据集的随机样本来减小总体大小。

    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的部分,这样就不会返回任何结果。

    查找等于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需要多长时间,可能有办法确定这种方法是否更快,但此时我们对数据集知之甚少。

    在连接上按下LIMIT

    这是最容易的,也是我倾向于的。

    SELECT col1, col1 FROM table1 join table2 on table1.col1 = table2.col1 LIMIT #
    

    假设连接良好,这将始终返回数据,并且至少在很多情况下它将快速执行。

1 个答案:

答案 0 :(得分:0)

第一种方法的问题是第一个表中的行可能在第二个表中没有匹配项。记住,内部联接不仅可以进行匹配,还可以进行过滤。

如果用于连接的所有列都有索引,则第二种方法可以工作。然后,您可以通过执行以下操作来获取匹配ID的列表:

where id in (select id from table1) and id in (select id from table2) . . .

这摆脱了初始代码,应该非常快。

第三种方法是最直接地使用数据库的功能。您将依赖于MySQL根据结果集的大小进行优化的能力。这是它所做的事情,至少在理论上是这样。

我强烈建议将第三种方法与连接中使用的列的索引结合使用。这需要对查询进行最少的更改(只需添加limit子句)。如果合适,它允许数据库进行额外的优化。它适用于更一般的查询集。