3

オーストラリアの郵便番号と住所の db テーブルがあり、15,000 行あり、各行は次のようになっています。

pcode   |   suburb      |   state
2048    |   Westgate    |   NSW
2066    |   Belina      |   NSW

jQuery オートコンプリートで入力フィールドをトリガーし、ユーザー入力を分割して LIKE クエリを作成し、郊外フィールドと郵便番号フィールドを検索しました。

これはトリックを行います:

SELECT address_id as id, CONCAT(suburb,' ',postcode) as value FROM address WHERE address_id != ''"; 

foreach ($keywords as $keyword)
{
      $query .= " AND (postcode like '".$keyword."%' OR suburb like '%".$keyword."%')";
}

現在、(主キーを除いて)どの列にもインデックスがありません。ある種の全文索引を使用して検索を変更したほうがよいでしょうか? または(巨大ではない)データ量が与えられた場合、私が行っていることは十分に効率的です

4

2 に答える 2

1

インデックスを使用する場合は使用できないLIKE '%something%'ため、文字列の途中で検索できるようにする必要がある場合は、わざわざインデックスを使用しないでください。

これが、MATCHコマンドがプレフィックス付きのワイルドカードを許可するが、プレフィックス付きのウィルカードは許可しない理由です。単一の単語にインデックスが付けられるため、接尾辞のワイルドカードを通常のインデックスのように管理することはできません。左の文字がインデックスの最も重要な部分であるため、インデックスから「*nitedstates」を即座に取得することはできません。

ソース

于 2012-05-06T01:29:28.397 に答える
1

最も効率的なタイプの索引は、数値列索引を使用するものです。他の人が示唆したように、15k はレコードの大きなセットではありませんが、ユーザー エクスペリエンスの観点から、単一の文字を入力すると、多数のレコードが存在する可能性があるため、使いやすさの悪夢になります.

提案-SQLでLIMIT句を使用して、結果セットを管理可能なサイズに制限できるようにします..一度に15レコードとしましょう..

于 2012-05-06T01:44:33.060 に答える