2012-05-01 13 views
4

次はうまくいきますが遅すぎます。私はテーブルBに一致するレコードがあることを知る必要があるので、そこに何かトリックがありますか?MySQL:2つの表AとBが一致するレコードを検索するBが大量の場合

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

CLIENTIDが現在インデックスされる(妙に反対の検索が参加していないレコードを(NULL IS)非常に速いです見つける)が、それは劇的に非常に速いからクエリを遅くし、この副次句です分。

(03May12もっと強力なサーバー上の同じデータベースでこの同じクエリを試してみましたが、クエリには1秒かかります)元のサーバーが完全にオーバーロードされているというのは皮肉なことですテーブルのサイズを減らすために削除できるレコードを特定するのに使用されます。より高速なサーバーでデータベースを再構築し、クリーンアップしてから「スロー」サーバーで再生成する必要があります)

+1

テーブルにインデックスがありますか? – Taryn

+1

'TableB.TableA_id'に' FOREIGN KEY'が正しく定義されていますか?それはパフォーマンスを向上させる指標となるでしょう。 ( 'TableA.id'はPKであるため、すでにインデックスされていると仮定します) –

+0

... FOREIGN KEY(TableA_id)のように参照してください。参照表A(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

このクエリは、で、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でない必要がある場合。これがより良い解決策になることを期待してください。

関連する問題