2

1 という 2 つのテーブルがあります。テーブル A - 複数の列があり、主キーが user_id (900,000 以上のレコード) です。 2. テーブル B - user_id という単一の列 (900 以上のレコード) があります。

テーブル A には、テーブル B などのすべての user_id が含まれています。* 一致する A,B 行の列のリストを user_id で取得する必要があります。以下のクエリを使用しています。p4 マシンで 100% CPU を使用して既に 1 時間実行されていますが、結果は表示されません。

SELECT a.* FROM tableA AS a INNER JOIN tableB AS b ON a.user_id = b.user_id;

クエリの実行を高速化する方法はありますか?

4

1 に答える 1

1

まず、両方tableAtableBがフィールドにインデックスを持っていることを確認しuser_idます。


標準的な手法で問題が解決しない場合は、次を使用してMySQLにこれら2つのテーブルを異なる順序で結合させることができますSTRAIGHT_JOIN

SELECT a.*
FROM          tableB AS b /* first process the 900 rows */
STRAIGHT_JOIN tableA AS a /* and find matching rows for every tableB row */
           USING user_id; /* BTW, you could use USING here :) */

http://dev.mysql.com/doc/refman/5.0/en/join.html

STRAIGHT_JOINはJOINに似ていますが、左側のテーブルが常に右側のテーブルの前に読み取られる点が異なります。これは、結合オプティマイザがテーブルを間違った順序で配置する(少数の)ケースに使用できます。

その他の情報:http ://dev.mysql.com/doc/refman/5.0/en/left-join-optimization.html

...LEFTJOINまたはSTRAIGHT_JOINによって強制されるテーブル読み取り順序..。

LEFT JOINの場合、生成されたNULL行のWHERE条件が常にfalseの場合、LEFTJOINは通常の結合に変更されます。

于 2012-08-05T08:44:49.827 に答える