我有两张桌子。每个人都有大约50K记录。两者都有一个共同的领域。我想要公共字段匹配的两个表的记录。所以我使用以下SQL代码。问题是查询现在已经运行了20分钟而且什么也没发生。对我来说,这花了很多时间似乎很奇怪。我想知道是否有更好的方法来实现我的目标。提前感谢您的回复。
我的SQL代码:
Select * from tableOne T1, tableTwo T2
Where T1.name = T2.name
顺便说一句,我对php解决方案开放(循环或其他任何东西,如果它更好......)
答案 0 :(得分:2)
两件事:
您需要确保两个表中的 name 列都有索引。否则,查询必须基本上扫描每个表的每一行以查找匹配。
理想情况下,索引应包含您要在查询中选择的“包含列”。否则查询将无法完全使用索引,但必须返回到表并为每行手动获取其他列。这意味着您应该考虑在查询中仅选择所需的列(而不是*),并将这些列作为包含的列添加到索引中。
答案 1 :(得分:1)
试试这个:
select *
from tableOne t1
inner join tableTwo t2 on t1.name = t2.name
虽然我怀疑这会有所作为,但尝试不会受到伤害。不建议使用
from tableOne t1, tableTwo t2
,因为你暗中制作了一个笛卡尔积!
答案 2 :(得分:0)
答案 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,你需要在这两个表之间设置一个外键 - 这肯定会解决你的性能问题。