2009-05-03 13 views
45

サイトでjqueryオートコンプリートを使用する予定で、テストバージョンを実装しました。今、文字入力ごとに文字列の新しいリストを取得するためにajax呼び出しを使用しています。問題は、新しいリストが作成される前に1.5秒遅れてしまうことです。オートコンプリートを高速化する最善の方法は何ですか?私はcakephpを使って、検索をして10項目の制限をしています。Jqueryオートコンプリートのパフォーマンスを向上させる方法

+0

を削除しますか? – Powerlord

+0

このクエリはどのように見えますか? 10アイテムの1.5秒はばかげて遅いです。 SOLRについての私の他のコメントを参照してください。何百万行もの行がある私たちの魅力のように働いていました。 – Ligemer

+0

最高の改善...選択したjqueryプラグインを使用してください! –

答えて

52

This article - 約flickrはどのように自動補完するのが非常に良いですか?私はそれを読んでいるいくつかの "うわー"の経験​​がありました。

「このウィジェットは、(これも10,000接点を持つ メンバーのために真である)200msの下 で、JavaScriptで、すべての連絡先 のリストをダウンロードします。 ために このレベルの性能を得るために、私たちは完全に のデータを サーバーからクライアントに送信する方法を再考しなければなりませんでした。

+1

その記事へのすばらしいリンク:) –

+1

+1素晴らしいもの。 – josh3736

+1

だから彼らはcsv-listをユーザーに送るだけですか? – tstenner

4

この場合の速度に関する実際の問題は、データベースでクエリを実行するのにかかる時間です。クエリの速度を向上させる方法がない場合は、検索結果を拡張して上位のランク付けされた結果を含むアイテムを追加すると、1文字おきに1つの検索を実行し、クライアント側で20〜30の結果をフィルタリングできます。

これはパフォーマンスの外観を改善する可能性がありますが、1.5秒で最初にクエリの速度を向上させようとします。

その他の情報をご提供いただければ、より具体的な回答を得ることができます。

幸運を祈る!

+0

ええ、あまりにもそれを提案するつもりだった..クライアント側でいくつかのフィルタリングを行います。 – Niyaz

+0

ちょっと! SOLRを使用してください。あなたはURLを直接打つことができます。私はちょうどプロジェクトにそれを統合し、それはあなたのdbクエリの問題を解決します。 MySQLからSOLRにデータをロードすることもできます(これはcakephpから推測しました)。 – Ligemer

11

1.5秒間隔は、オートコンプリートサービスを提供するための非常に広いギャップです。

  1. まず、クエリとdb の接続を最適化します。メモリキャッシュを使用してdb接続を維持してください。
  2. サービスが再フェッチを無視するために高度に使用されている場合は、結果キャッシングメソッドを使用します。
  3. クライアントキャッシュ(JSリスト)を使用して、古いリクエストをクライアントに保存します。ユーザーが入力して消去しても、それは有用になるでしょう。バックエンドポイントの代わりにフロントエンドキャッシュから結果が得られます。
  4. クライアント側での正規表現フィルタリングにはコストがかかりませんが、その可能性はあります。
5

いくつかの最適化を行う前に、まずボトルネックの位置を分析する必要があります。各ステップ(入力→要求→dbクエリ→レスポンス→表示)の所要時間を調べてみてください。おそらく、CakePHPの実装では、入力されたすべての文字に対してリクエストを送信しないようにする遅延があります。

4

PHP/SQLではサーバサイドが遅いです。

PHP/SQLは使用しないでください。私のオートコンプリートはC++で書かれており、ハッシュテーブルを使って検索します。掲載結果はhereです。

これはCeleron-300コンピュータ、FreeBSD、Apache/FastCGIです。

これは、巨大な辞書ですばやく実行されることがわかります。 10,000,000レコードは問題ではありません。

また、優先順位、動的翻訳、およびその他の機能もサポートしています。

+0

あなたのコードのリンクを教えてください... – Lucky

+1

http://olegh.cc.st/autocomp-dist-64.tar.bz2 – maxihatop

+0

http://olegh.cc.st/autocomplete.html - 利用できません –

1

オートコンプリート自体は遅くはありませんが、実装は可能です。まずチェックするのは、遅延オプションの値です(jQueryドキュメントを参照してください)。次に、私はあなたの質問をチェックするでしょう:10レコードを戻すだけかもしれないが、それらの10レコードを得るために巨大なテーブルスキャンをしていますか?あなたは、データベースからレコードの大量をコレクションに持ち帰り、データベース上でサーバー側のページングを行う代わりにコレクションから10個のアイテムを取っていますか?簡単なインデックスが役立つかもしれませんが、確かめるためにいくつかのテストを行う必要があります。

36

オンザフライでクエリを実行する代わりにリストオブジェクトをプリロードしてみてください。

また、オートコンプリートにはデフォルトで300msの遅延があります。
おそらく1.5秒でオートコンプリートの待機時間を(つまり、それはあなたが追加の文字を入力していないことを確認するために待機する時間です)含まれています遅延

$(".selector").autocomplete({ delay: 0 }); 
+0

+1の遅延。私はこれが理由の1つであることを忘れていました。私はなぜデフォルトの遅延時間が300ミリ秒だが0ミリ秒ではないか分からない。 –

+1

あなたの質問がうまくいけば、ここでも+1してください。 クエリが10個のリスト項目に長時間かかる場合、クエリに何か問題があり、これは必要な答えではありません。 – Ligemer

+1

遅延オプションのデフォルト値を指定する公式のJQuery https://api.jqueryui.com/autocomplete/#option-delay –

関連する問題