速く、さらに速く見える

QAセクションで興味深い質問に出会いました。 それに対する答えは、「Yandex市場のように、多くのパラメーターを使用して検索を整理する方法」という質問に対するより完全な答えとしてこの記事を書くようになりました。



Habréには、noSQLソリューションの支持者がたくさんいることは知っています(罪がないわけではありません)が、それでも私は最初に考え、次にソリューションを選択することの支持者です。



だから、DANOには何がありますか?





ヒステリーは、1秒間に100を超えるリクエストを処理する必要があるという理解から生まれました。そのためには、クレムリンを視野に入れて3ルーブルのメモを販売し、鉄を追加購入する必要があります。



だから、私たちはたくさんのお金を節約し、ボーナスとしてあなたのポケットに部品を入れる方法について考え始めています。

データベースから必要な行のリストをすぐに取得するという目標を設定していないことにすぐに気付きます。 検索とフィルタリングのプロセスを高速化するために、事前ろ過を行う必要があります。



チェックボックス




まず、値が2つしかないすべてのチェックボックスをビットに変換し、1つの「数値」にグループ化します。 私たちの場合、この数は120ビット(偶数カウントの場合は128ビット)になります。 これが最初の「インデックス」になります。 それに応じて、条件に一致する製品をいつでも除外できます。 実際には、平均して、ベース全体でこのような商品は1万個以下です。 残りのパラメーターは、これらの1万個の製品でのみ確認でき、ベース全体を「シャベル」することはできません。



範囲




任意の範囲(身長、体重、ウエスト、バストボリューム)を間隔に分割して番号を付けることができます。 256の部分に分割します。 図は「天井から」撮影されています。 いずれにしても、$ 100-$ 1200の範囲の2つの数値を取得します。 最大$ 25,500で$ 1-$ 100を使用する場合、範囲を2 | 12と書くことができます。実際、これは16ビットの数値です。 可能な範囲の数ごとにそのような数があります。 それらの数が少ない場合は、ここで停止します。100〜10000の場合は、すべてがより複雑になります。 200〜20000ビットのキーを適切にすばやく検索することはできません。 はい、できません。md5で計算するだけです。プロセスを高速化するために、すべてを128ビット数(ある種の哀れな16バイト)に変換します。 多くの「チェックボックス」と組み合わせることで、より正確な選択が可能になります。



はい/いいえ/重要ではない




addでこれらの値を見つけるためのアルゴリズム。 パラメータ「重要ではない」は、チェックボックス付きのオプションとほぼ同じですが、インデックスに1 / yesだけを書き込むことを除きます(「重要ではない」を選択した場合は0)。 2番目のインデックスでは、オプション「重要ではない」に0を、その他に1を入れます。



合計2つのインデックスを取得します。

1インデックス:01010000001010101010001

2インデックス:01111101110111101110111



宿題は、Xor | And |または、index2のすべての重要でないビットをリセットし、index1と比較する要求を通じて構築することです。



したがって、1200万件のレコードから0〜100〜500の一致条件が見つかりました。 すでに完全にチェックされるのはこれらのレコードです(120ビットのチェックボックスフィールド、範囲、および多くのYes / No / Not Important)。 数百行の完全なチェックは、本格的な検索よりもはるかに高速であることに同意します。



...


利益!!!




たとえば、暗号化によって長いキーを短いキーに変換するオプションは、データをフィルタリングするのに十分便利です。 同時に、SQLを使用する場合、事前フィルターの選択をMemTableに保存して、このデータを使用した高速化と完全なフィルター処理を行うことができます。



同様のアルゴリズムは、チェックサムから32ビットを取得し、128ビットよりも比較が速い場合、シングルによるテキストのフィルターで使用されます。

同様の手法は、1つの特殊なドキュメントストレージシステムで機能します。これにより、マイクロ秒で2.2Gbのテキストデータベースで検索単語またはフレーズが置かれているドキュメントへのリンクを見つけることができます。 しかし、それについては別の記事で詳しく説明しています。



All Articles