2011-09-27 46 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