1

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

我的 SQL 代码:

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

顺便说一句,我对 php 解决方案持开放态度(循环或其他更好的...)

4

6 回答 6

2

两件事情:

  1. 您需要确保两个表中的name列都有索引。否则,查询将不得不扫描每个表的每一行以查找匹配项。

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

于 2012-05-16T20:15:55.513 回答
1

试试这个:

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

尽管我怀疑这会有所作为,但尝试不会受到伤害。不建议使用 from tableOne t1, tableTwo t2,因为你在隐式地制作笛卡尔积!

于 2012-05-16T20:18:59.370 回答
0

我相信最好使用Join

像这样的东西:

SELECT *
FROM tableOne
INNER JOIN TableTwo
ON tableOne.name=TableTwo.name
于 2012-05-16T20:16:00.717 回答
0

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

SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name
于 2012-05-16T20:16:04.017 回答
0

MySQL Inner Joins - 你在那里发生的事情 - 非常有效。50K 条记录根本不算多,即使对于有几百万条记录的一对表来说,20 分钟也长得离谱。尝试重新启动查询,或者只是重新启动整个 Web 服务器。查询本身是否正常(尽管最好从每个表中准确指定您想要的列,即使您想要除一个之外的每一列)。如果您没有索引,添加索引也是一个好主意。

于 2012-05-16T20:18:16.803 回答
0

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

于 2012-05-16T21:00:41.177 回答