3

現在、自動車販売店のサイトを構築中です。ユーザーが amazon や ebay のように検索結果を絞り込めるようにしたいと考えています。クリックで結果を絞り込める機能は素晴らしいでしょう。問題は、私がこれを行っている方法です.COUNTの合計でそれぞれ実行する必要がある多くの異なるクエリがあります。

したがって、結果を絞り込む主な方法は次のとおりです。

  • 車両タイプ
  • 作る
  • 価格帯
  • 新品/中古

現在、このページが読み込まれるたびに 5 つのクエリを実行して、設定値を渡しながら結果の数を取得しています。

クエリ 1:

SELECT vehicle_type, COUNT(*) AS total FROM inventory
[[ Already Selected Search Parameters]]
GROUP BY vehicle_type
ORDER BY vehicle_type ASC

クエリ 2:

SELECT make, COUNT(*) AS total FROM inventory
[[ Already Selected Search Parameters]]
GROUP BY make
ORDER BY make ASC

クエリ 3,4,5...

1回のクエリでこれを行う方法はありますか? 速いですか?

4

3 に答える 3

2

あなたのクエリは合理的です。

次を使用して、単一のクエリで実行できますUNION ALL

SELECT 'vehicle_type' AS query_type, vehicle_type, COUNT(*) AS total
FROM inventory
...
GROUP BY vehicle_type

UNION ALL

SELECT 'make', make, COUNT(*) AS total FROM inventory ... GROUP BY make

UNION ALL

SELECT ... etc ...

これによるパフォーマンス上の利点はそれほど大きくありません。

これらのクエリを頻繁に実行していて、結果が頻繁に変化しない場合は、結果をキャッシュすることを検討してください。memcacheなどの使用を検討してください。

于 2012-07-16T18:09:04.520 に答える
1

データ ウェアハウジングに沿ってデータをランク付けする方法はいくつかありますが、検索用語で達成しようとしているものはファセットと呼ばれます。実際の検索エンジン (あなたが言及したサイトで使用される) がこれを実行します。

多くのサイトでは、SOLR を備えた Lucene (Java ベース) 検索エンジンを使用して、参照している内容を実現しています。RESTful API を備え、ファセットを提供する ElasticSearch という新しいソリューションがありますが、Java、ES をインストールする必要があり、ネイティブ JSON を返す検索エンジンを呼び出すことができます。

それほど多くの結合を必要とせずにMySQLでそれを行うには、追加のテーブルが必要になる可能性があり、おそらくトリガーして複雑になります. 自動車販売店が Cars.com のトラフィック (1 日あたり数百万) を期待していない場合、実際に必要になる前に何かを最適化しようとしている可能性があります。再帰クエリは十分に高速である可能性があり、実際の問題やボトルネックがあることを報告していません。

于 2012-07-16T18:09:19.080 に答える
1

JOIN 構文を使用します: http://dev.mysql.com/doc/refman/5.6/en/join.html

または、そのための MySQL 関数を記述できると思います。検索パラメータを渡す場所。 http://dev.mysql.com/doc/refman/5.1/en/create-function.html

どこが速いかを見つけるには、独自の速度テストを行う必要があります。これにより、一部のクエリが結合しなくても高速になることがわかりました。

于 2012-07-16T18:12:08.180 に答える