2011-09-27 48 views
2

假设我有2个表:多列性能的左连接?

table1 :(20.000 records) 
id code1 code2 something status 

table2: (7.500 records) 
id code1 code2 name 

所有我想要通过使用本查询列表中的“名称”表1中的所有记录表2:

SELECT DISTINCT `tb1`.*, `tb2`.`name` FROM `table1` AS `tb1` 
LEFT JOIN `table2` AS `tb2` 
ON (tb1.code1 = tb2.code1 AND tb1.code2 = tb2.code2) 
WHERE (tb1.status = 1) 

但我花了太长时间检索数据(5分钟后我仍然无法看到结果)。

这样做的最好方法是什么?

在此先感谢..

+0

当你只想要右手表的某些状态的记录时,为什么要进行LEFT JOIN?只要做一个INNER JOIN,并检查你的表是否有适当的索引。 – nnnnnn

+0

糟糕,我的排字错误。对不起:D。我更新了我的问题 –

+0

您确定自己的数据是否如您期望的那样?在table2中有多行具有相同的code1和code2(例如多行Code1 ='abc'和code2 ='def')?如果花费5分钟以上,则必须拉回HEAP行。 – mwan

回答

3

请尽量使用列(代码1,代码2,状态)表1添加索引。如果table1中没有太多列,则可以将它们添加到索引中。在MS SQL中,我们有“包含列”,我们可以添加到索引。也许mysql有类似的东西。

使用列(code1,code2,name)在table2上添加索引。

如果您担心索引大小,那么只需为index1保留(code1,code2,status)并为index2保留(code1,code2)。

希望这会有所帮助。

+0

你是我的英雄。它像一个魅力。非常感谢你。 –

+0

不客气。并感谢“接受”。 – Nabheet

+0

@Nahbeet你能给出一个如何使用左连接索引的代码示例吗?我有同样的问题,但无法找到有关此操作的文档。 – user2205916