2016-06-22 3 views
2

私はMySQLで非常に簡単なクエリを実行しようとしています。私が達成しようとしているのは、1つのクエリで2つの異なるテーブルからいくつかのデータを選択することです。しかし、1つのテーブルからデータを選択すると、クエリは高速に実行されますが、両方のテーブルからデータを選択すると、非常に遅くなります。私はこのようなルックスを実現したい2テーブルから選択するとmysqlクエリが非常に遅い

マイクエリ:

SELECT k.klantId, b.bestelId 
FROM klanten k, bestellingen b 
WHERE k.klantId=b.klantId AND voornaam LIKE '%henk%' 

上記のクエリを実行するために約20秒かかります。

しかし、私はこのように私のクエリを実行すると、クエリにのみ秒という以内に実行されます。

SELECT k.klantId 
FROM klanten k, bestellingen b 
WHERE k.klantId=b.klantId AND voornaam LIKE '%henk%' 

私はまた、「bestellingen」テーブルから別の列を選択しようとしましたが、それも非常に遅いです。

余分なフィールドを選択すると、どのように遅くなる可能性があるのですか?

---------------------

私はそこにいましたが、今は選択する列を増やしてテーブルを使い果たしていました。今はもう18秒かかりますが、拡張クエリで何か問題が起きている可能性があります。誰がこれに間違っているのを見ますか?

SELECT filiaalId, bestelId, k.klantId, totaalPrijs, b.statusId, b.tmInvoer, geprint, verzendwijze, betaalwijze, afhaalpuntId, verzendkosten, betaalwijzeKosten 
FROM klanten k LEFT JOIN bestellingen b ON (k.klantId=b.klantId) 
WHERE (k.voornaam LIKE '%henk%' OR k.achternaam LIKE '%henk%' OR b.bestelId LIKE '%henk%') 
ORDER BY b.tmInvoer DESC 
+0

クロスジョインの代わりに「INNER JOIN」を試してください。デカルト積は推奨できません。 – Gruber

+0

インデックスを使用することを忘れないでください。 –

+0

フラットファイルに切り替えます。 – GOD

答えて

5

mysql結合を使用してみると、これは高速になるはずです。

SELECT k.klantId, b.bestelId 
FROM klanten k LEFT JOIN bestellingen b ON (k.klantId=b.klantId) 
WHERE voornaam LIKE '%henk%' 

はまたk.klantIdb.bestelIdがインデックス化されている2つの列を確認してください可能性があります。

+0

これは完璧です、それは働いています。なぜそれが速いのか私に説明することができますか? – user3824329

+0

この事実を議論する他の良い質問があります。 [ここ](https://stackoverflow.com/questions/1129923/is-a-join-faster-than-a-where)または[ここ](https://dba.stackexchange.com/questions/42998)をご覧ください。/are-individual-queries-faster-than-joins)。問合せオプティマイザは、複数の表の場所を使用するよりも、結合を使用してより良い実行計画を生成できます。 – cb0

+0

あなたは私の投稿を編集した別の表情をつけてもらえますか?私は何か間違っているのですか? – user3824329

関連する問題