MySQL:选择相关行

时间:2014-05-26 08:13:16

标签: mysql sql

我有 big_table,行数约为数百万,而correlation_table约有数千行。 Corelation_table big_table字段值将dep_id的行相互关联。

我想big_table选择关联行的所有ID。

示例:

       big_table
id     name     dep_id  <other_data>
341  "vehicle"    6       .....
342   "byce"      19      .....
343  "ferrari"    6       .....

correlation_table
dep_id1 dep_id1
   6      19

expected result:
id1 id2     
341 342
343 342

问题: 如何在MySQL中以最有效的方式做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以通过为相关表提供两个不同的别名来加入大表两次,如下所示:

SELECT
  b1.id AS id1,
  b2.id AS id2
FROM
  big_table b1
  INNER JOIN Correlation_table c ON c.dep_id1 = b.id
  INNER JOIN big_table b2 ON b2.id = c.dep_id2

但是如果你想从一亿行表中选择所有这些记录,这可能需要一段时间。但我不认为这比这更有效。

索引可能有帮助,但如果您要选择所有记录,则很难。连接的顺序可能会有所帮助,因此您可以从相关表开始,看看它是否更快:

SELECT
  b1.id AS id1,
  b2.id AS id2
FROM
  Correlation_table c
  INNER JOIN big_table b1 ON b.id = c.dep_id1
  INNER JOIN big_table b2 ON b2.id = c.dep_id2

这取决于确切的数字。 big_table中的所有行是否都已连接,您是否要选择所有这些行,或者不选择多少组&#39; (dep_ids)在那里,等等。

答案 1 :(得分:1)

试试这个:

select b1.id, b2.id  from big_table b1 join correlation_table on depl_id = dep_id1 join big_table b2 on dep_id1 = b2.bep_id

它应该一起加入表格

答案 2 :(得分:0)

dep_id列编入索引肯定是必须的。但是,我不明白为什么你首先拥有该专栏。您的预期结果&#34;显示了使用主键(已编入索引)而不是任何其他值将一个big_table条目与另一个big_table条目相关联的交叉表的结构。关键字段具有唯一的额外好处,而dep_id字段则不能。这应该可以加快搜索速度。

要将big_table条目与另一个big_table条目相关联,您无法自行加入表格cross_table join big_table join big_table。但是,不要让big_table有一亿行关注你。如果交叉表条目引用已编制索引且唯一的字段,则仅使用索引搜索而不是索引(或表)扫描来访问big_table。因此big_table的大小不会是一个因素。您会注意到,如果您过滤查询以限制搜索(where t1.id = 341where t1.id in( a, small, list )),则响应将近乎即时。