2010-06-16 33 views
1

我知道这里有类似的线程,但这是我第一次意识到查询速度可能会影响我 - 所以对于我来说,真正实现从其他的传输并不那么容易人们的问题。提高MySQL中JOIN的速度

这就是说,我已经用较小的数据成功地使用了下面的查询,但如果我用它在轻度大表(大约120,000条记录)上。我在等待几个小时。

INSERT INTO anothertable 
    (id,someint1,someint1,somevarchar1,somevarchar1) 
    SELECT DISTINCT md.id,md.someint1,md.someint1,md.somevarchar1,pd.somevarchar1 
    FROM table1 AS md 
    JOIN table2 AS pd 
    ON (md.id = pd.id); 

表1和表2包含约120,000条记录。该查询已运行近2个小时。这是正常的吗?我只需要等待。我真的不知道,但我非常肯定,可以做得更好,因为这是我第一次尝试。

我读了索引,但不知道在我的情况下索引什么?

感谢您的任何建议 - 随时指向我的初学者指南!

回答

1

假设id是一个自动增量PK,DISTINCT是无用的,因为每一行都是唯一的。在这种情况下,删除它也应该提高性能,因为SELECT DISTINCT可能非常慢。

如前所述,请确保id字段在两个表上都有索引(如果是PK,它的确会有索引)。

+0

抱歉不提这个事实。 Id不是一个auto_increment PK id,这些表确实有一些auto_increment id PK,但这里没有用到,因为我不能使用这两个数据匹配数据。 – 2010-06-16 09:41:32

1

索引你加入的东西。在这种情况下,请在table1.id和table2.id上创建索引。您应该也可以从一个表到另一个表中有一个外键,但没有有意义的名称,很难就方向提出建议。

0

唯一认为你可以索引,也许你得到一些速度是联接(md.id和pd.id)的关键。由于它们很可能是主键,它们应该已经被索引。也许聚集索引会带来一些东西。

DISTINCT是否真的有必要?它只是删除重复项,并且只有在源表中存在重复的项时才可能。我认为DISTINCT是这里最大的问题。

+0

thx。此处需要DISTINCT,因为我所做的是汇总数据。 table1包含来自不同时间点的观测值,而table2包含一些观测元数据 。 “anothertable”是汇总信息的表格,所以每个人只需要一次,这就是我使用DISTINCT的原因。 – 2010-06-16 09:48:59