1

mysqlで内部結合がどのように機能するのか疑問に思っていました。

私が行った場合

SELECT * FROM A a 
INNER JOIN B b ON a.row = b.row
INNER JOIN C c ON c.row2 = b.row2
WHERE name='Paul';

最初に結合を行い、次に name = paul のものを選択しますか? こうやってやると、超・デューパー・スローだから。

行に沿って何かを行う方法はありますか:

SELECT * FROM (A a WHERE name='paul')
INNER JOIN B b ON a.row = b.row
INNER JOIN C c ON c.row2 = b.row2]

そのようにしようとすると、エラーが発生します。

または、A、B、および C に対して 1 つずつ、3 つの個別のクエリを使用する方がよいでしょうか? 例:

string query1 = "SELECT * FROM A WHERE name = 'paul'";
//send query, get data reader
string query2 = "SELECT * FROM b WHERE b = " + query1.b;
//send query, get data reader
string query3 = "SELECT * FROM C WHERE c = " + query1.c;
//send query, get data reader

明らかにこれは単なる疑似コードですが、要点を示していると思います。

どちらの方法が速い/推奨されますか?

テーブル構造の編集:

**tblTimesheet**
int timesheetID (primary key)
datetime date
varchar username
int projectID
string description
float hours

**tblProjects**
int projectID (primary key)
string project name
int clientID

**tblClients**
int clientID
string clientName

The join that I want is:

select * from tblTimesheet time
INNER JOIN tblProject proj on time.projectID = proj.projectID
INNER JOIN tblClient client on proj.clientID = client.clientID
WHERE username = 'paul';

そんな感じ

4

4 に答える 4

2

結合が 3 つのデータベース ヒットより遅くなる可能性は非常に低いです。MySQL のクエリ オプティマイザーが十分に機能している場合、句を並べ替えても影響はありません。WHERE/句の列はON索引付けされていますか?

于 2012-06-29T16:09:45.513 に答える
2

ほとんどの場合、クエリ オプティマイザが最適なクエリを提供することがわかると思います。クエリが遅い理由を見つけるには、実行計画を確認する必要があります-私の推測では、インデックスが不足しています。

MySqlがこれらのテーブルを調べるとき、通常は最高の速度を得るために最善の方法でそれを行います-あなたが示したような単純な結合はクエリオプティマイザーを混乱させませんが、インデックスが見つからないとデータベースエンジンが代わりにテーブルをスキャンする可能性があります値を検索する (つまり、指定した条件に一致するようにテーブルを 1 行ずつ調べる必要がある)

インデックスにより、エンジンはリーフ ページ レベルまで検索する必要がなくなり、通常はクエリが高速化されます。

ここのテーブル構造は何ですか、それともすべて仮説ですか?

SQL の一般的な経験則は、試してみてください!

于 2012-06-29T16:10:15.220 に答える
2

キー テーブルのインデックスが欠落している可能性があります。MySql EXPLAINキーワードを使用して、クエリが遅い場所を見つけることができます。

あなたの質問の別のセクションに答えるには;

is there a way to do something along the lines:

SELECT * FROM (A a WHERE name='paul')
INNER JOIN B b ON a.row = b.row
INNER JOIN C c ON c.row2 = b.row2]

SubQueryを使用できます。

SELECT * 
FROM (SELECT * FROM  tblTimesheet WHERE username = 'Paul') AS time
INNER JOIN tblProject proj on time.projectID = proj.projectID
INNER JOIN tblClient client on proj.clientID = client.clientID

このクエリが効果的に行っているのは、JOIN が操作するフィールドを事前にフィルター処理しようとすることです。すべてのフィールドを結合してからフィルター処理するのではなく、最初に名前が「Paul」である tblTimesheet からのフィールドのみを結合しようとします。

ただし、クエリ オプティマイザは既にこれを行っているはずなので、このクエリは元のクエリと同様に実行されるはずです。

インデックスの詳細については、これを理解するとデータベース開発に大いに役立ちます。まず、このようなチュートリアルを参照してください。

于 2012-06-29T16:28:04.223 に答える
1

最初のクエリを使用します。mySql クエリ オプティマイザーは最速の戦略を選択する必要があります

より高速にしたい場合は、name列にインデックスがあることを確認してください

于 2012-06-29T16:10:27.330 に答える