2012-05-01 92 views
4

以下工作正常,但速度太慢。我只需要知道表B中有匹配的記錄,所以有什麼竅門?MySQL:查找匹配兩個表A和B的記錄,其中B很大

(奇怪的是相反的搜索:發現不加入記錄(IS NULL)是非常快的)

SELECT 
    TableA.id 
FROM 
    TableA 
    LEFT JOIN 
    TableB 
    ON 
    TableB.TableA_id = TableA.id 
WHERE 
    TableB.id IS NOT NULL and TableA.clientid=13 ; 

客戶端ID現在已經收錄但本條這大大減緩了查詢從非常快分鐘。

(03May12我現在已經在一個功能更強大的服務器上的同一個數據庫上試過這個相同的查詢,並且查詢需要一秒鐘。所以看起來我的問題是我的原始服務器完全超載,具有諷刺意味的是,上面的查詢是我將不得不在一個更快的服務器上重建數據庫,清理它然後在「慢」服務器上重新生成它)

+1

你有什麼索引在你的桌子上? – Taryn

+1

你有'FOREIGN KEY'在'TableB.TableA_id'上正確定義了嗎?這將提供一個可以提高性能的指標。 (我們假設'TableA.id'是一個PK,因此已經編入索引) –

+0

...像'FOREIGN KEY(TableA_id)REFERENCES TableA(id)' –

回答

2

index應該在TableB上創建.TableA_id和TableA.id

SELECT 
    Count(TableA.id) 
FROM 
    TableA 
    JOIN 
    TableB 
    ON 
     TableB.TableA_id = TableA.id And TableB.id IS NOT NULL 
and TableA.clientid=13 ; 
1

此查詢查找來自A th在也是B:

SELECT TableA.id 
FROM TableA 
JOIN TableB ON TableB.TableA_id = TableA.id 

這將表現良好,如果有上TableB.TableA_id指數(上TableA.id指數無關,這個查詢的性能)

0

試試這個

SELECT TableA.id 
FROM TableA 
INNER JOIN TableB ON TableB.TableA_id = TableA.id 

在這你不需要使用不爲null的內部連接。希望這會更好的解決方案

相關問題