2012-01-24 7 views
0

まず、ここで私がお話しますクエリです:期待される結果のMySQLですべてまたはGROUP BYをフェッチしますか?すべての

SELECT route_id, direction_id 
FROM stop_times 
LEFT JOIN trips USING (trip_id) 
WHERE stop_id= 1002 
GROUP BY CONCAT(route_id, direction_id) 

例:

だから、
route_id | direction_id 
----------------------------- 
106   | 0 
106   | 1 
13   | 0 
13   | 1 
21   | 0 
4   | 0 
4   | 1 
6   | 0 

、このクエリを実行すると、0.088秒のavergeがかかります。これは大丈夫です...しかし、GROUP BYを削除すると0.0026秒かかります。

今私の質問は:

GROUP BYを行うとMySQLですべてを処理またはすべてを取得し、PHPの配列でそれを処理する方が良いでしょうか?

おかげ

+1

を持っているか、エラーの種類を働いていないなら、私に知らせて) 'GROUP BY route_id、direction_id'ではなく?または単に 'SELECT DISTINCT route_id、direction_id'を実行し、' GROUP BY'節を削除しますか?(私はちょうど 'LEFT JOIN'によって少し混乱しています。あなたの予想される結果に' NULL'sが含まれていないとき、あなたの結合が 'IN'または' EXISTS'の下位のサブクエリにうまく変換されるかどうか疑問です。テーブルの定義はわかりにくいです。) – ruakh

+1

@ruakh +1訂正だけでなく、不正確な結果の生成を避けることができます。 'route_id'と' direction_id'が '12,1'と' 1,21'の行のペアを想像してください。これらは、 'CONCAT'を使用するときに誤ってグループ化されます。 –

+0

@ruakh良い質問。私は答えがありませんが、はい、あなたは正しいです...テストをしなかったし、それは同じ時間量がかかります。 –

答えて

2

あなたはこの置き換えることができます:あなたははるかに少ない時間で同じ結果になります

GROUP BY route_id, direction_id 

:このことにより

GROUP BY CONCAT(route_id, direction_id) 

を。

+1

データによっては、同じ結果が得られない場合があります。質問に対する私のコメントを参照してください。 –

2

GROUP BYのようなものは、データベースがために設計されているものです。 100分の1秒未満の違いは心配するべきではありません。実際のパフォーマンス上の問題が生じるまで、最適化を開始する必要はありません。

+0

この場合のクエリは非常に遅いです。なぜなら、 'GROUP BY'を削除すると約30倍高速になるからです。さらに、10分の1秒を要するクエリは、おそらく(おそらく)ページを構築するときに最も遅い要素の1つです。インデックスを改善できると思う。 – Arjan

+0

@Arjan私のページはこのクエリで0.0026から0.1062にジャンプし、彼女はほとんど終わりです。 –

+0

@DavidBélangerそれは私が言っていることです...あなたの要求は0.05秒かかることがあります0.1秒かかる必要はありません。 – Arjan

0

GROUP BYがなくてもクエリが高速で、追加されると速度が遅くなるため、インデックスはグループ化に使用されていないようです。実際には、tripsroute_id, direction_idをカバーするインデックスがないようです。 tripsの唯一のインデックスはtrip_idで始まり、これには使用できませんGROUP BY

route_id, direction_idのインデックスをtripsに追加することをお勧めします。列はGROUP BYステートメントで使用されているのと同じ順序でなければならないことに注意してください。

+0

私は、GROUP BYのトリップでプライマリインデックスを使用できるはずだと思います。 –

0

stop_times.stop_idにインデックスを追加する必要があります。

また、GROUP BY句でCONCATを取り除くことも検討してください。私はあなたが間違ってそれをやっていると推測しています。

また、ここではGROUP BYの使用について不思議です。重複を削除するためにそれを使用している場合は、DISTINCTを使用する必要があります。結果を並べ替えるには、ORDER BYを使用します。

まだ問題が解決しない場合は、EXPLAINの結果をお知らせください。

0

これを試してみてください:私はそれをテストしていない

SELECT concat_route_direction 
FROM 
(SELECT CONCAT(route_id, direction_id) AS concat_route_direction 
FROM stop_times 
LEFT JOIN trips USING (trip_id) 
WHERE stop_id= 1002) AS concat_route_direction 
GROUP_BY concat_route_direction 

、あなたがCONCAT(route_id、direction_id BY `GROUPを持っているか、なぜあなたは

+0

0.0806秒。あなたのクエリは 'GROUP_BY'が' GROUP BY'でなければ動作しません。ちょっとミスですが、私はキャッシュを使って問題を解決しました(PHPで)。 –

関連する問題