连接两个表,这些表具有在第三个表上引用相同键的键,而不使用第三个表

时间:2014-11-28 16:16:44

标签: mysql

我有一个名为A的表,它有一个名为id的外键,它引用了表B上的id 我还有一个名为C的表,它有一个引用表B上的id的外键。 我想加入表A和C,只使用A和C的公共数据,我不在乎B是否有额外的数据

我可以使用这个:

A inner join C on a.id=c.id

或者我必须使用它:

A inner join B on a.id=b.id inner join C on b.id=c.id

我问的唯一原因是因为我读到我必须在外键上使用连接因为它更安全但是如果我只能使用1连接而不是2那么为什么不呢?

1 个答案:

答案 0 :(得分:1)

像MySQL这样的RDBMS允许你将任何列连接到任何其他表中任何兼容(相同数量和类型)的列集,所以是的,你的第一个查询将起作用。但如果MySQL无法找到要使用的索引,那将会很慢。 (当加入某个表的PK列时,总会有一个索引要使用,所以这些连接总是(相对)快。)

如果两个表的id字段都没有索引,那么MySQL将需要进行嵌套循环连接,除非其中一个表非常小,否则可能会很慢 - 它可能需要时间成比例到表大小的产品。要为MySQL查询规划器提供使用索引的最佳机会,请确保ab中至少有一个在其id字段中具有索引(或者更常见的是,多个字段的索引, first id)。通常最有意义的是将索引放在较大的表上,并循环遍历较小的表的每一行,使用其索引查找另一个表中的项目 - 但查询计划程序实际选择的策略最终取决于它自己估计各种不同的可能计划的效率。

使用EXPLAIN检查它是否确实在使用您的索引。