RDBを使用するときにアプリケーションのパフォーマンスを最適化する方法

それらはどこでも動作します-MySQLでさえ、少なくとも自己記述型データベースでさえも。 データベースが賢くなればなるほど-彼女は自分自身を最適化しようとしますが、彼女を助ける方が良い



1.分割して征服しますが、データベースを単純にクラスター化します。同じタイプのすべてのデータはクラスターに分割できます。個別のテーブル、いくつかの単純なルールを満たすレコードは各テーブルに分類されます。たとえば、ID%のデータはインデックスIのテーブルに分類されますN ==I。ここで、Nはクラスターの数です。 したがって、連続して読み取る必要のないデータを非常に簡単かつ効果的に分割します。たとえば、すべての単語を1億から2億ブロックに分割し、各ブロックではID%N == Iの単語のみを分割します。 例として、ソーシャルネットワークなどの大規模システムでは、1人のユーザーに属する属性ですべてのデータを分割できます。たとえば、すべての写真をN個のテーブルに入れ、写真に関する情報をテーブルK = USER_ID%N



2.条件付き-ディスクを操作します。 常に連続して書き込み(貼り付け)、記録をキャッシュおよびバッファリングし、最初から最後まで連続して読み取ります。 記録を高速化するのは素晴らしいことです-あなたの(またはメーカーの)ディスクへの書き込みアルゴリズムのしくみを正しく記録を使用するからです。 ほとんどの場合、データは書き込み前に並べ替えることができます-メモリ、テキストの異なるファイルなど、データIDで並べ替えられたインデックスまたは単純な配列を作成し、インデックスと同じ順序で読み書きできます。 オプションの1つとして、より最適なデータストレージ構造を常に考え出すことができます。 たとえば、テーブルの一部を別のテーブルに挿入する必要がある場合、小さいIDから大きいIDに順番に挿入し、同時にインデックス作成メカニズムを無効にすることをお勧めします。 挿入後にオンにします。



3.頻繁に必要なものをディスクに保存しないでください。メモリにロードしてください。 これで、ギガバイトを簡単にメモリに入れることができます。 すべてが収まらない場合は、データを断片に分割し、1つの断片で作業を行います。 memcachedや類似物はこのようなタスクには役立ちません。データが処理される順序を知っているのはあなただけなので、標準のユーティリティよりも10倍速くソリューションを作成できます。 多くの「古い」構造は、データの使用に適しています。

-ハッシュ(すべてのデータは、CRC%Nなどのルールに従って部分に分割されます)

-AVLおよびBツリー(愛する人のために紙、ペン、C / C ++を取り、アルゴリズムを読まずに定義のみに従って自分で実装することを強くお勧めします-自分で開発してください。

-順序付きサンプリングによるヒープ



4.ポインターと関連構造を使用します。 ソーシャルネットワークの例:1億枚の写真の中から、特定の人物がマークされている写真を見つけるのは難しい場合がありますが、その人物に関する情報ではそのような写真のリストを簡単に保持できます。 同様に、検索中のページへのすべてのリンクをメモリに保存することは不可能ですが、サイトのルートのURLは簡単に配置できます。 完全なCRCまたはルートID(とにかく)を計算することにより、このサイトのすべての既知のリンクが書き込まれているファイル内の場所をすばやく見つけ、このリンクが存在するかどうかを確認できます。



非常に単純または愚かなルールを除き、この投稿にすべての新しいニュアンスを追加しようとします。 MySQLでインデックスを設定する方法については説明しません。これには、何百ものマニュアルがあり、ソリューションが本当に機能するかどうかを確認する多くの方法があります。 それでもこのような単純なことを知らない場合、この投稿の情報が有用であったかどうかはわかりません...



そしてもう1つ、私は、どのタスクでも最適化するものがあると考えています。これが重要な場合は、最適化を行い、同時にこのトピックについて独自の教育を行います。



検索エンジンに関する私の記事の全内容とリストはここで更新されます: http : //habrahabr.ru/blogs/search_engines/123671/



All Articles