1

私は2つのテーブルを持っています。それぞれに約 50K のレコードが入力されます。どちらにも共通のフィールドが 1 つあります。共通フィールドが一致する両方のテーブルのレコードが必要です。そこで、次の SQL コードを使用します。問題は、クエリがすでに 20 分間実行されていて、何も起こらないことです。こんなに時間がかかるなんて、私には奇妙に思えます。私の目標を達成するためのより良い方法があるのだろうか. 返信ありがとうございます。

私のSQLコード:

Select * from tableOne T1, tableTwo T2 
Where T1.name = T2.name

ちなみに、私はphpソリューション(ループまたはそれがより良い場合は何でも...)を受け入れています。

4

6 に答える 6

2

2つのこと:

  1. 両方のテーブルの名前列にインデックスがあることを確認する必要があります。それ以外の場合、クエリは基本的に各テーブルのすべての行をスキャンして一致を探す必要があります。

  2. 理想的には、インデックスには、クエリで選択する「含まれる列」が含まれている必要があります。そうしないと、クエリでインデックスを完全に使用できなくなりますが、テーブルに戻って、行ごとに手動で他の列を取得する必要があります。これは、クエリで (* ではなく) 必要な列のみを選択し、それらの列を含まれる列としてインデックスに追加することを検討する必要があることを意味します。

于 2012-05-16T20:15:55.513 に答える
1

これを試して:

select *
from tableOne t1
inner join tableTwo t2 on t1.name = t2.name

それが違いを生むとは思えませんが、試してみても害はありません。from tableOne t1, tableTwo t2暗黙的にデカルト積を作成しているため、の使用はお勧めしません !

于 2012-05-16T20:18:59.370 に答える
0

テーブルのストレージエンジンは何ですか?InnoDBの場合は、これら2つのテーブルの間に外部キーを設定する必要があります。これにより、パフォーマンスの問題が確実に解決されます。

于 2012-05-16T21:00:41.177 に答える
0

Joinを使用する方が良いと思います

このようなもの:

SELECT *
FROM tableOne
INNER JOIN TableTwo
ON tableOne.name=TableTwo.name
于 2012-05-16T20:16:00.717 に答える
0

両方のテーブルから名前で結合する行を取得するには、内部結合である必要があります。

SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name
于 2012-05-16T20:16:04.017 に答える