2

編集:

大きなデータ(データベース全体、または多数のテーブル)をキャッシュできるかどうかを調べている理由は、対称rijndaelキーのIVベクトルが異なるさまざまな行であっても、データベースの列が暗号化されているためです。したがって、SQLフィルタリングはオプションではないか、インデックス作成には意味がありません。また、アプリケーションは、実際にはクラウドおよびビジネスアプリケーションのフレームワークであり、可能な限りデータベースに依存しないように設計されています。メールアドレスやSSNなど、非常に機密性の高い情報のみを保持するテーブルの一部の列のみを暗号化することをお勧めしますが、フレームワークが非標準になり、暗号化された列と暗号化されていない列のそれぞれについて新しいコードを作成する必要があります応用。キャッシュに問題がなければ、オブジェクトベース、辞書、linqなどですべての操作を実行できます。

すべてまたはほとんどのデータベーステーブル(暗号化)をメモリにキャッシュする予定です。

私はクラウドベースのアプリケーションに取り組んでおり、さまざまなクライアントで共有される100MBのSQL Server/MySQLの制限があります。(したがって、キャッシュ時にクライアントごとにグループ化できます。さらに、ビジネスモデルに応じて、より小さなキャッシュグループを作成することもできます)

私にはわからなかった。SELECT * FROM100000行、10 MB、または20MBのデータなどをフェッチするのにかかる時間。

すばやく検索しましたが、大量の行を取得するための「おおよその」期間を示すベンチマークは見つかりませんでした。

私の会社は、現代世界のほとんどの中小企業で一般的に使用されているビジネスソフトウェアを使用しています。毎日アクティブなレコードがあり、4。5年間で20MBのMySQLデータしかないと言われています。

MySQL Administratorをチェックインしたところ、最大のテーブルはinventory_movementsであり、45000行の7MBのデータがあることがわかりました。

MySQLクエリブラウザを使用して実行し、このテーブルからすべてのレコードを選択しました。ソフトウェアツールは、 0.4971秒かかったと述べています。今、私は考えを持っていると思います。

C#.NETですべての行(純粋のみSELECT * FROM、フィルターなし、結合)をフェッチします。SQL Serverデータベースからの7MBのデータ-45000行は、同様の期間になりますよね?2秒か3秒ならまだ大丈夫です。

こちらです; 少なくとも私には考えがあります。100MBのデータをキャッシュする場合。おそらく5〜30秒かかります。(データはフェッチ中に復号化されません)(必要に応じて後でRAMで復号化されます)(データベース機能のほとんどが失われていることを認識しています。クエリはキャッシュ内のオブジェクトに基づいて行われます)(私はこのコメントを書いているときに考え始めたばかりです。成功した場合は、無料のデータベースソースとしてxmlを使用することもできます。これは、このアプリケーションのOR / Mのような関数を設計しているためです)

私の質問は;

十分なリソースがあればすぐに100MBのデータをキャッシュしても問題ありませんか?言い換えると; メモリリソースができたらすぐに100MB、さらには500 MB、1 GBをキャッシュするのはおかしなことではありませんか?

第二に、SELECTを使用してレコードをフェッチするための私の時間計算は楽観的だと思いますか?

アプリケーションの開始時。データをキャッシュできます。頻繁にリロードキャッシュを行うことなく、キャッシュとデータベースの両方で変更/追加/削除されたデータを管理します。

4

3 に答える 3

3

すばやく検索しましたが、大量のレコードを取得するための「おおよそ」の期間を示すベンチマークは見つかりませんでした。

そして、あなたは決してそうしません。データベースが応答する速度は非常に多くの変数に依存しているため、誰かがそれに答えることは不可能です。サーバーの技術仕様は何ですか?サーバーにいくつのプロセッサを許可していますか?読むためにテーブルにどのようにインデックスを付けましたか?

ご覧のとおり、組織外の人が回答することはできません。

十分なリソースがあればすぐに100MBのデータをキャッシュしても問題ありませんか?言い換えると; メモリリソースができたらすぐに100MB、さらには500MB、1GBをキャッシュするのは賢明ではありませんか?

要するに、私が始める前に、あなたは間違った視点からキャッシングを見ています。プロセッサのキャッシュについて少し考えてみましょう。それは何のために使われますか?頻繁な操作がより速く行われるようにするために使用されますよね?ええと、それはデータキャッシングが使用されるものです-しかし、それはコインの片側にすぎません。

データキャッシングが存在する2番目の理由について話しましょう。毎日300万以上の操作を実行するアプリケーションがあるとします。多くのように思えますが、フォーチュン500企業では現実的ですか?次に、キャッシュを使用して、頻繁に使用されるデータ(トランザクション駆動型データであっても)へのデータアクセスに、ユーザーが視覚化するボトルネックがないことを確認します。

一般的に言って、ボトルネックはデータベースエンジン、プロセッサ、RAM、キャッシュ、さらにはネットワークではないことを参照してください。一般的に、ボトルネックはI/Oです。1日に300万回以上データベースの読み取り/書き込みを行うことは、16KRPMドライブを実行している最大かつ最も高性能なSANでさえ期待するには多すぎます。

そこで、私たちは何をしますか?データを複数のマシンに分散し(1台がダウンした場合に備えて負荷分散のために)、RAMに保存します。なんで?可能な限り最速のI/Oであるため、シンプルです。

つまり、1日に何百万もの操作を実行しない限り、500MBまたは1GBのデータをキャッシュする必要がある可能性が高いと言いました。実際、そこには「私のアプリケーションが行うことはここにあります」がないため、正確に何を実行しようとしているのかは質問からは明らかではありませんが、キャッシュがまったく必要ない可能性があります。

このすべてを覚えておいてください。データキャッシングは些細なことではありません。

于 2012-12-27T04:09:24.640 に答える
1

データベースサーバーとWebサーバーが同じマシン上にある場合、ネットワークレイテンシに悩まされることはありません。したがって、考慮すべき時間は、データベースからデータを取得する時間と、データベース内でオブジェクトを構築する時間だけです。 Webサーバー。オブジェクトのインスタンス化を迅速に行うことができる場合(データテーブルの表現である場合は可能であるはずです)、見積もりはそれほど楽観的ではありません。これは、実行する必要のあるselectステートメントの数に少し依存します。

個人的には、大量のクエリを回避するためにキャッシュが設定されていない限り、めったに変更されないデータテーブルをキャッシュすることをお勧めします。この投稿の目的上、設計上の決定は適切であると想定します。

于 2012-12-27T00:29:02.173 に答える
0

大量のデータをキャッシュする場合は、そのデータに対する操作(並べ替えや検索など)に時間がかかることを考慮する必要があります。これで、これらのタスクを実行したことがない場合でも、心配する必要はありません。

一方、特にデータベースが同じサーバー上にあると言ったように、メモリに大量のデータをキャッシュする必要性が問題になる場合があります。

キャッシングは、静的で変更されないデータがある場合に最適です。あなたはそれを処理し、あなたの場合はそれを解読して保存することを含み、それによって将来のアクセスが毎回同じ仕事をすることから節約します。

于 2012-12-27T03:50:59.277 に答える