2011-11-04 4 views
1

PHPで自分のサイトのカスタム検索機能を永遠に構築するのに費やしました。ここでは、エンドユーザーが提供するオプションと入力に基づいてMySQLクエリを段階的に構築します。私のローカルサーバーでは完全に動作しますが、プロダクションサイトにアップロードするとSUPERが遅くなります。私はPHPやMySQLでプログラミングするのは比較的新しいので、一般的で将来のプロジェクトには興味があります:PHPやMySQLに重労働をさせる方が良いですか?

検索クエリを実行するとき、データをフィルタリングする複雑で正確なMySQLクエリPHPの結果を表示するか、単純なMySQLクエリを実行してデータベースから多数のデータを取得し、PHPにデータをフィルタリングして結果を表示させますか?

+2

プロフィール、プロフィール、プロフィール... –

+1

フィルタリングをやっていることに依存しない - からのデータのマルチギグ上で送信するにはポイントを巨大なテーブルで、1つのレコードの1つのフィールドから1バイトだけを除いてすべてPHPをスローします。しかし、YMMV。 –

答えて

0

私はあなたが最良の結果を得るために組み合わせることができると思います。まず、正確な一致または本当に近い一致のクエリを実行します。基本的に、誰かがページの正確な名前を検索した場合、それを返すだけです(LIKEではなく)。次に、もし彼らが最初の部分を右に持っていれば(LIKE 'words%')。最後に、MySQLを使ってより重い作業を行う、より複雑なものを構築してください。これにより、ユーザーが最良のデータを提供したときに最も速く戻ることが保証されます。

0

Webアプリケーションを最適化する際にいくつかの変数が使用されます。あなたが述べたことに基づいて、ユーザーが「クエリをビルドする」ためにいくつかのオプションを選択できるようにすると、貴重なMySQLオプションを実行している可能性があります。あなたはORから離れたいと思っています。もしあなたがORDER BYを行う必要があれば、配列の結果を配列して配列を並べ替えるだけで、アプリケーション層でそれを行うことができます。

また、毎回データベースにヒットする必要がないように、MySQLレイヤーの上にあるキャッシュレイヤーを追加することをお勧めします。

Kerrek氏がコメントで述べたように、ボトルネックがどこにあるのかを確認するには、XDebug(http://xdebug.org/)とKCacheGrind(http://kcachegrind.sourceforge.net/html/)をチェックしてください。 Home.html)

あなたが始めてみるのにちょっとしたアイデア。

2

これはバランスの取れた行為です。ここに私の提案があります:

  • 文字列検索を高速化するには、FULLTEXTを使用してください。
  • WHERE句にフィールドを並べ替え、インデックス付きの列を最初に、次に数字を、次に日付を、そしてテキストフィールドを次にします。これにより、安価なカラムを高価なカラムの後にフィルタリングすることで負荷を軽減し、データベースの処理量を削減します。
  • 大きなデータセットを扱うときはORDERを避け、この処理をPHPコードにオフロードします。これは、MySQLがクエリの各ポイントでデータを並べ替えることを防ぐためです。
  • インデックス最も一般的に使用されるか検索コストの高いフィールドです。
  • 2つ以上のクエリを簡単に実行できる場合は、多数のJOINを使用しないでください。一部の大きなテーブルで10または20個のJOINを持つクエリは、データベースを完全に終了させる可能性があります。
  • UNIONは、ORを使用して複雑なロジックを実行する代わりに、同じテーブルでいくつかのSELECTクエリを一度に実行すると便利です。

一般に、最適なクエリで十分です。 PHPで作業をするのは便利ですが、99%のケースではデータベースの速度が十分速くなければならない場合があります。

1

多くのWebサーバーがデータベースにアクセスする場合、おそらくMySQLサーバーに多くの処理を行うようにするのは良い考えではないでしょう。第二に、大量のデータを生成するクエリを使用すると、データをWebサーバーに転送する時間が長くなり、PHPでさらに処理する必要があります。一方、MySQLは多くの最適化を使用しているので、データを効率的に取得できます。

できるだけ多くは、ほとんどの場合、理にかなっているように、それはすべてあなたがデシベルで

関連する問題