MySQL - 跨越两个表的最佳实践

时间:2012-05-16 20:12:30

标签: php mysql sql select

我有两张桌子。每个人都有大约50K记录。两者都有一个共同的领域。我想要公共字段匹配的两个表的记录。所以我使用以下SQL代码。问题是查询现在已经运行了20分钟而且什么也没发生。对我来说,这花了很多时间似乎很奇怪。我想知道是否有更好的方法来实现我的目标。提前感谢您的回复。

我的SQL代码:

Select * from tableOne T1, tableTwo T2 
Where T1.name = T2.name

顺便说一句,我对php解决方案开放(循环或其他任何东西,如果它更好......)

6 个答案:

答案 0 :(得分:2)

两件事:

  1. 您需要确保两个表中的 name 列都有索引。否则,查询必须基本上扫描每个表的每一行以查找匹配。

  2. 理想情况下,索引应包含您要在查询中选择的“包含列”。否则查询将无法完全使用索引,但必须返回到表并为每行手动获取其他列。这意味着您应该考虑在查询中仅选择所需的列(而不是*),并将这些列作为包含的列添加到索引中。

答案 1 :(得分:1)

试试这个:

select *
from tableOne t1
inner join tableTwo t2 on t1.name = t2.name

虽然我怀疑这会有所作为,但尝试不会受到伤害。不建议使用 from tableOne t1, tableTwo t2,因为你暗中制作了一个笛卡尔积!

答案 2 :(得分:0)

我认为最好使用Join

这样的事情:

SELECT *
FROM tableOne
INNER JOIN TableTwo
ON tableOne.name=TableTwo.name

答案 3 :(得分:0)

应该是一个内部联接,以从两个表中获取名称连接的行。

SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name

答案 4 :(得分:0)

MySQL内部联接 - 你在那里发生的事情 - 效率非常高。 50K的记录根本不是很多,即使是一对有几百万个条目的表,也只有20分钟。尝试重新启动查询,或只是重新启动整个Web服务器。查询本身如果正常(尽管最好指定您想要的每个表中的哪些列,即使您希望除了一列之外的每一列)。如果您没有索引,那么添加索引也是一个好主意。

答案 5 :(得分:0)

你桌子的存储引擎是什么?如果它是InnoDB,你需要在这两个表之间设置一个外键 - 这肯定会解决你的性能问题。