0

約 100 万行の氏名/会社名を含む as400 テーブルがあり、元のデータストアと同じ速度で別のデータストアを使用するように変換したいと考えています。

現在、ユーザーが検索を入力すると、ほぼ瞬時にテーブル内の検索語のアルファベット順の位置と一致するページが取得されます。その後、ユーザーは非常に迅速にレコードを上下にページ付けできます。

データの更新はほとんどなく、週に約 50 件の挿入があります。どのデータベースでも名前のアルファベット順のインデックスを維持できると考えていますが、データセット内で検索の位置をすばやく見つける方法がわかりません。どんな提案でも大歓迎です。

4

3 に答える 3

2

これは、結果の通常のページ付けと同じように聞こえますが、リクエストされたページ番号またはオフセットに基づいて特定のページに移動するのではなく、ユーザーの検索が検索結果のどこにアルファベット順に収まるかに基づいて特定のページに移動する点が異なります。

この位置の後に 10 行、前に 10 行をフェッチするとします。

ユーザーが「Smith」を検索する場合、次のように 2 つの選択を行うことができます。

SELECT
  name
FROM
  companies
WHERE
  name < 'Smith'
ORDER BY
  name DESC
LIMIT 10

その後

SELECT
  name
FROM
  companies
WHERE
  name >= 'Smith'
ORDER BY
  name
LIMIT 10

UNION を実行して 1 つのクエリでそれを取得できます。上記は単純化されています。

ユーザーが検索した用語は、これらの結果の半分に収まります。完全一致があれば、最初の完全一致が 11 番目になるように配置されます。

ユーザーが 'aaaaaaaa' を検索すると、最初の 10 件の結果だけが得られ、'zzzzzzzz' は最後の 10 件の結果しか得られないことに注意してください。

問題の SQL エンジンは文字列間の >= と < の比較を許可する (そしてインデックスでそれを最適化できる) と仮定していますが、これはテストしていません。MySQL のように、国際化された照合をサポートしている場合は、ASCII 以外の文字の順序付けを正しく行うこともできます。

于 2009-03-07T16:20:34.707 に答える