1

こんにちは私は問題に遭遇しました。私はjquerysの有名なオートコンプリートを実装し、データベースからリスト(かなり長い)を作成してオートコンプリートフィールドに出力しています。しかし、リストから正しい値を見つけるのに時間がかかりすぎています。誰かが私がこれをスピードアップできる方法を知っていますか?これが私のjqueryです:

<script>
    $(function() {function log( message ) {$( "#destId" ).val( message );}
        $( "#destinations" ).autocomplete({
            source: "destinos.php",
            minLength: 2,
            select: function( event, ui ) {
                log( ui.item ?
                    "" + ui.item.id :
                    "" + this.value );}});});
    </script>

そしてここにdestinos.phpがあります:

//connect to database
include 'php/dbconn.php';
$term = trim(strip_tags($_GET['term']));//retrieve the search term that autocomplete sends

$qstring = "SELECT Destination as value, DestinationId as id FROM DestinationId WHERE Destination LIKE '%".$term."%'";
//query the database for entries containing the term
    $result = mysql_query($qstring);
//loop through the retrieved values   
    while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
    {
            $row['value']=htmlentities(stripslashes($row['value']));
            $row['id']=htmlentities(stripslashes($row['id']));
            $row_set[] = $row;//build an array
    }
    echo json_encode($row_set);//format the array into json data

どんな助けでも大歓迎です!

4

2 に答える 2

3

ほとんどの場合、データベース クエリを高速化する必要があります。そのためには、いくつかのことを行う必要があります。

  1. Destinationフィールドにインデックスがあることを確認してください。
  2. 文字列の途中から一致する必要がある場合を%除き、LIKE クエリから先頭を削除して、インデックスを使用できるようにします。MySQL は、先頭のワイルドカードを使用してインデックスを効果的に使用することはできません。
  3. 先頭を残す必要がある場合は、jQuery で 3 に%設定します。minLengthこれにより、MySQL はパターンに対して最適化アルゴリズムを使用できるようになります。

ソース: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

于 2012-09-11T21:10:27.780 に答える
1

DBの側面から始めます。

まず、 にインデックスがあることを確認する必要がありますDestination

LIMIT次に、たとえば 10 行または 20 行の使用を検討する必要があります。オートコンプリートでは、ほとんどの場合、一度に多くの結果を表示する必要はありません。ユーザーがかなり速く入力し続けると、一致カウントが減少します。

$term第三に、クエリを実行する前に、変数に対して適切な mysql エスケープを使用する必要があります。

残りはかなり簡単に見えます。

于 2012-09-11T21:09:54.913 に答える