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

标签 mysql sql optimization join

我正在从事一个涉及数据集之间连接的项目,我们需要允许预览任意数据集之间的任意连接。这很疯狂,但这就是它有趣的原因。这是使用面向所以给定一个连接我想快速显示 ~10 行结果。

我一直在围绕不同的方法进行实验,以这样一种方式对不同的表进行子抽样,这样我至少可以获得一些结果行,但要保持样本足够小,以便连接速度快,并且不会导致抽样贵。

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

  1. 这些连接或数据集会在哪些类型的情况下失败?
  2. 我如何识别这些数据集?
  3. 如果这两者在同一件事上都不好,如何改进它们?
  4. 有没有我没有放在这里的更好的抽样类型?

有限制的子选择。

对一个数据集进行随机采样以减小整体大小。

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 的良好示例,但选择不同查询可能比连接更昂贵。我相信,如果您知道不同的校准需要多长时间,那么可能有一种方法可以确定这种方法是否更快,但目前我们对数据集的了解还不多。

在连接上设置 LIMIT

这是最简单的,也是我倾向于的。

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

假设连接很好,这将始终返回数据,并且至少对于大量情况,它会很快完成。

最佳答案

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

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

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

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

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

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

关于mysql - 预览 MySQL 连接的快速方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15032061/

相关文章:

mysql - 根据另一张表从一张表中提取信息的查询

mysql - 如何选择 2 列的唯一组合并将结果插入具有自动增量功能的第三个表中

mysql - SQL AVG(平均)返回大量数字

php - 为什么 SQL 时间戳不是 UTC?

mysql - 优化 "OR"运算符以绕过 SQL 异常 "maximum number of expressions in a list is 1000"

mysql - 如何使用 codeigniter 连接 3 个表,表中没有任何空值?

mysql - 使用外键创建表不起作用?

mysql - 有没有更有效的方法来编写这个查询?

c++ - 如何在新 CPU 上利用 AVX2,同时支持旧 CPU?

MySQL 查询消耗的 CPU 使用率是正常 CPU 使用率的 5-6 倍