どのDBMSが超高速読み取りと単純なデータ構造に適していますか?


16

運用の一環として、多数のファイル/ディレクトリを追跡する必要がある製品を開発しています。アイデアは、統計情報をデータベースに保存し、ブート時に各ファイルのウォッチを作成することです。変更されたファイルは、リモートデータベースへのグループ同期のために(データベース内で)キューに入れられます。それらは優先順位の順に同期され、1から10の間の数値になります。

データベースに関する情報:

  • <100,000エントリの統計情報
  • 起動時にデータベース全体が読み込まれ、ファイルパスのみが必要です
  • キューに入れられたファイルには優先度フィールドがあります(他に何も検索する必要はありません)
  • 挿入が遅い場合があります

うまくいくと思うデータベースをいくつか見つけましたが、どちらが最適かはわかりません。

  • Redis-ファイルパスをキーとして、統計データを値として保存。キューはリストになります
  • MongoDB -Redisよりも多くのクエリオプションがありますが、それでも高速です

ここでは、リレーショナルロジックが多すぎず、合計データサイズが大きすぎない(100 MB未満、30 MB未満に近い)NoSQLデータベースが最適なソリューションになると考えています。SQLiteは、インストール可能なアプリケーションに組み込むのに十分なほど単純だと思われるため、SQLiteを検討しました。

これはエンドユーザー向けの分散アプリケーションであり、高負荷サーバーではないため、データベースは多くの同時ユーザーをサポートする必要はありません。ここでの最優先事項は、モデルが最も意味のあるデータベースを見つけることです。

それでは、この状況に最も適したデータベースはどれですか?

また、このようなアプリケーションにとってより意味のある他のデータベースはありますか?

回答:


9

最初に思い浮かぶのは、私がよく知っている特定のRDBMSです。ただし、このアプリケーションには最適でない場合があることを認識しています。

そのため、私のアドバイスは、使い慣れたデータベースを使用することです。RedisまたはMongoDBに精通している場合は、それらのいずれかを使用してください。SQLiteに詳しい方は、それを選択してください。

このサイズのデータ​​ベースでは、すべて非常に高速になります。よりディスクが重いデータベースでも、何らかのキャッシュを使用するため、ディスクの速度はあまり気になりません。


ええ、そのサイズのデータ​​ベースは完全にメモリ不足になる可能性があります。
ニックチャマス

1
私はMySQL(何年も経ちました)、CouchDB、およびRedis(まだ始まったばかり)に精通しており、SQLiteでも同様の構造を参照できます。このサイズのdbでは、それほど重要ではないと思います。
beatgammit

12

リレーショナルロジックにそれほど関心がなく、非常に高速な読み取り速度が必要で、RDBMSを使用したい場合、MySQLと言うのは偏見に過ぎません。なぜ ???

MyISAMストレージエンジンには、パフォーマンスを向上させるためにテーブルの物理構造を拡張できるオプションがあります。そのオプションは何ですか?ALTER TABLEオプションROW_FORMAT。

たとえば、MySQL Database Design and Tuningは、72,73ページでROW_FORMAT = FIXEDを使用することを推奨しています。これにより、すべてのVARCHARフィールドが内部的にCHARに変換されます。MyISAMテーブルが大きくなりますが、それに対して実行されたSELECTははるかに高速になります。私はこれを個人的に証明できます。かつて1.9GBのテーブルがありました。ALTER TABLE tblname ROW_FORMAT = FIXEDでフォーマットを変更しました。テーブルは3.7GBになりました。それに対するSELECTの速度は、他に何も改善したり変更したりすることなく、20〜25%速くなりました。

データが入力されたMyISAMテーブルが既にある場合はどうなりますか?MyISAMテーブルにあるデータに基づいて、推奨される列定義のメトリックを取得できます。それらのメトリックを示すクエリは何ですか?

SELECT * FROM tblname PROCEDURE ANALYSE();

PROCEDURE ANALYZE()これはデータを表示しません。すべての列の値を読み取り、列の定義を推奨します。たとえば、値が1〜4のタイプ列がある場合、それらの4つの値のENUMを使用して提案します。その後、同じ量のスペース(1バイト)を使用するため、TINYINTまたはCHAR(1)の使用を選択できます。

他に考慮すべきことがあります:NoSQL DBの使用を考えていたので、NoISA方式でMyISAMを使用することを考えたことがありますか?これはかなり可能です。私が言及たのと同じ本の175ページでは、HANDLER構造を使用して、リレーショナル手荷物なしでテーブルを読み取ることを提案しています。実際、175ページにこの例を示します。

CREATE TABLE customer_mileage_details
(
    customer_id INT NOT NULL,
    ff_number CHAR(10) NOT NULL,
    transaction_date DATE NOT NULL,
    mileage SMALLINT NOT NULL,
    INSERT(customer_id),
    INSERT (ff_number,transaction_date)
) ENGINE = MYISAM;

このテーブルには数百万行が含まれています。次の要件を持つデータ分析アプリケーションを作成する必要があるとします。

  • 情報ブロックをできるだけ早く取得する必要があります。
  • ユーザーの入力またはその他の要因に基づいて、テーブル内で「ジャンプ」する可能性があります。
  • 並行性またはその他のデータ整合性の問題には関係ありません。
  • アプリケーション間のテーブルロックは必要ありません。

これらのコマンドは、テーブルからの迅速で汚れた読み取りを許可します。

HANDLER customer_mileage_details OPEN;
HANDLER customer_mileage_details READ ff_number FIRST WHERE ff_number=('aaetm-4441');
HANDLER customer_mileage_details READ NEXT LIMT 10;
HANDLER customer_mileage_details CLOSE;

これが思考の糧になることを願っています。調べてみてください。

警告

この特定の投稿を書いている私にとって非常に皮肉なのは、Percona Serverバイナリで使用されているHANDLERについての以前の投稿を書いており、それを使用することは時代遅れだと考えていることです。その古い投稿以来、私はHANDLER構造をサポートする何かを書くとは考えていませんでした。私は今修正されたままです。


1
MySQLをNoSQLデータベースとして使用することに関する興味深い点ですが、これはRedisやMongoDBのようなものを使用することで何が買われるのでしょうか?
-beatgammit

1
素早い回答?リレーショナルモデルに戻らなければならない場合は、レポートを作成する目的であっても、移行を元に戻すためにすべての機能が用意されています。さらに、MyISAMのNoSQLスタイルのアクセスと組み合わせてリレーショナル操作を使用することもできます。BTW InnoDBでは、データへのHANDLERアクセスも許可されます。
-RolandoMySQLDBA

こんにちは@RolandoMySQLDBA、HANDLER構造と機能に関する詳細情報を探しています。mysql のmanページは私が見つけた唯一のページであり、そこにはあまりありません...私はこれを尋ねましたここに新しい質問:dba.stackexchange.com/q/253653/23271そして追加のリソースを知っているかもしれないことを望んでいましたか?
oucil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.