我有 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中以最有效的方式做到这一点?
答案 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 = 341
或where t1.id in( a, small, list )
),则响应将近乎即时。