3

興味深いデータベースの問題があります。サイズが150GBのDBがあります。私のメモリバッファは8GBです。

ほとんどのデータはめったに取得されないか、主にバックエンド プロセスによって取得されます。一部の機能でそれらが必要になるため、それらを維持することを非常に好みます。

その一部 (つまり、一部のテーブル、および特定のテーブルの一部の識別可能な部分) は、ユーザー向けの方法で非常に頻繁に使用されます。

後者が常にメモリに保持されていることを確認するにはどうすればよいですか? (これらには十分なスペースがあります)

詳細: Ruby on rails を使用しています。データベースはMYSQLで、テーブルはINNODBを使用して保存されています。2 つのパーティションにまたがってデータをシャーディングしています。シャーディングしているため、JSON BLOB を使用してほとんどのデータを保存し、主キーのみにインデックスを付けます

Update 2 注意が必要なのは、データが実際にはバックエンド プロセスとユーザー向け機能の両方に使用されていることです。しかし、後者の場合、それらははるかに少ない頻度でアクセスされます

更新 3 最近、8Gb はオモチャだと言う人もいます。私は同意しますが、よりスマートで効率的なソリューションがある場合、dbのサイズを増やすだけでは純粋な怠惰です

4

5 に答える 5

3

これが、データ ウェアハウスがある理由です。2 つのものを (a) 別々のデータベースまたは (b) 1 つのデータベース内の別々のスキーマに分けます。

  1. 最新の、すぐにアクセスできる、更新中のデータ。

  2. 歴史的事実、分析用、更新されていないデータ。

150Gb はそれほど大きくなく、1 つのデータベースで少量のライブ データと大量の履歴を処理できます。

「定期的な」ETL プロセスを使用して、アクティブなデータベースから情報を取り出し、スター スキーマに非正規化し、履歴データ ウェアハウスに読み込みます。

于 2010-05-20T17:36:14.453 に答える
1

これは memcached を呼び出します! ActiveRecord の優れたライトスルー キャッシング ライブラリである cache-money の使用をお勧めします。ngmoco ブランチは、モデルごとにキャッシュを有効にするためのサポートを備えているため、メモリに保持したいことがわかっているものだけをキャッシュできます。

コントローラー アクションまたはモデル フックで $cache.set/get/expire 呼び出しを使用して手動でキャッシュを行うこともできます。

于 2010-05-20T18:47:17.043 に答える
1

顧客向けテーブルで使用される列の数が少ない場合は、すべての列がクエリで使用されているインデックスを作成できます。これは、すべてのデータがメモリに残るという意味ではありませんが、クエリを大幅に高速化できます。応答時間の取引スペース。

于 2010-05-20T17:47:44.360 に答える
0

それで、問題は何ですか?

まず、150GB は今日ではあまり大きくありません。10年前のことです。

次に、まったくがらくたでないデータベース システムは、メモリをキャッシュとして利用します。キャッシュが十分に大きい場合 (使用中のデータ量と比較して)、効率的です。そうでない場合、できることはメモリを増やすことだけです (申し訳ありませんが、8 GB のメモリは最新のサーバーでは非常に少ないため、2 年前は低かったためです)。

メモリを効率的に使用するために何もする必要はありません。少なくとも商用レベルのデータベースではありません-おそらくmysqlは最悪ですが、私はこれを想定していません。

于 2010-05-20T17:39:52.303 に答える
0

MySQL では、クエリ キャッシュを適切に使用すると、頻繁にクエリされるデータがメモリに保持されます。SQL_NO_CACHE キーワードを使用して、(バックエンド プロセスなどからの) 特定のクエリをキャッシュしないように MySQL にヒントを提供できます。

バックエンド プロセスが履歴データにアクセスしている場合、またはレポート目的でデータにアクセスしている場合は、S. Lott の提案に従って、別のデータ ウェアハウスを作成し、代わりにクエリを実行してください。データ ウェアハウスを短期間で実現するには多すぎる場合は、トランザクション データベースを別のサーバーに複製し、そこでクエリを実行できます (データ ウェアハウスを使用すると柔軟性と機能が大幅に向上するため、可能であればその方法を使用してください)。

アップデート:

更新 2:

特定のテーブルなどを innodb バッファ プールに選択的にキャッシュするメカニズムがないことを MySQL サポートに確認しました。

于 2010-05-20T17:43:59.110 に答える