web-dev-qa-db-ja.com

10億件のレコードを保存する高速データベース

データを保存するコードを書いていますが、10億から100億以上のレコードを保存したいと考えています。これにとって最も重要なのは、速度(ほぼ10000〜20000 /レコード/秒)、スペースの使用量、およびクラッシュプルーフです。今、私はMySQL MyISAMで遊んでいますが、それはかなり高速に動作し、私たちに必要な速度に匹敵します。 MyISAMには最適なSPACE使用法もあり、MySQLデータフォルダー内のデータベースファイルは、挿入したデータの量とほぼ同じでした。それぞれ30文字の100000レコードの場合、3MBしかかかりませんでした。ただし、唯一の問題は、ACIDではなく、クラッシュ時にデータが失われる可能性があることです。

そのため、大量のデータを保存して高速に保存するのに役立つ代替手段(データベースソフトウェアを他のものに変更してもかまいません)を知りたいと思いました。

私はすでにMySQLINNODBを試しましたが、その挿入は非常に遅いです。私は毎秒800-1000 /レコードしか達成できませんでした。また、INNODBにデータを格納するためのスペースの量はかなり多いです。それぞれ30文字の同じ100000レコードを保存するには、約8MBかかります。

代わりにMongoDBも試しましたが、同じデータを保存するにはスペースが多すぎます。

SQLITE3 DBでさえ、100000レコードを書き込むのは非常に遅いです。 forループでPHPを使用してこれを試しました。また、約20レコードが欠落し、データベースが使用できないというエラーが発生しました。

だから私は自分の要件を満たすことができるオープンソースのデータベースソフトウェアを知りたいと思いました。 MariaDBsARIAはACIDに準拠していると聞きました。それは本当ですか?または、PostgreSQLも、最適なスペース使用率を備えた高速なオプションです。

私は、高速で、最適なスペースを利用し、クラッシュに強いソリューションを受け入れています。返信をお待ちしております。

=== MariaDBAriaの更新===挿入速度とスペースに関してはInnoDBよりもさらに悪いです。同じデータを挿入するのにInnoDBの1.5倍の時間がかかり、MyISAMが使用するスペースは約2.5倍でした。

2
Raheel

これは誰もが5分で100%「釘付け」できるようなものではありませんが、そのレベルのパフォーマンスと機能を達成したいのであれば一貫してそれならあなたはお金を使わなければならないだろうと強く思います。

これに予算がある場合は、Oracleの「TimesTen」エンジンを、おそらくエンタープライズSSDまたはPCIeフラッシュ(FusionIOなど)と組み合わせて検討します。それ以上の場合は、IntelのXeonE7-xxxxを使用することをお勧めします。シリーズは、障害が発生した場合にサーバーを可能な限り長く稼働させ続けるための素晴らしいRRAS機能を備えています。

7
Chopper3

より多くの機能とより優れたパフォーマンスを得ることが単に異なるソフトウェアを使用することの問題である場合、誰もがそれを行うでしょう(少なくとも少数の人々はまだITに取り組んでいます;)

ACIDサポートが必要な場合-それならなぜmongoDBを試すのですか?

Innodbで必要なスループットを得るのはかなり可能です(ただし、myisamの方が高速です)。ハードウェアに十分な費用をかけ、システムを適切に調整すれば。ただし、最初の制約はスペースの使用量を最小限に抑えることです。これは、SSDRAIDセットを購入する予算がないことを意味します。

クラッシュ時にデータが失われる可能性があります

OracleとSybaseでのクラッシュによるデータの損失を見てきましたが、理論的には、これらはより回復力があるはずです。私は通常、そもそもクラッシュを回避するために時間、労力、お金を費やしていました(専用サーバー、妥当な品質のハードウェア、UPS、安定したソフトウェアを使用)。

SQLITE3DBでさえ非常に遅い

SQLiteは、基盤となるファイルシステムに特に敏感です(ただし、これはすべてのデータベースに影響します)。これが実行されているファイルシステム(またはオペレーティングシステム!)について言及していないと、インストールの調整に多くの時間を費やしていないと思います。

もし私だったら MariaDB -mysqlのフォークであり、改良されたISAMエンジン( Aria )これにはいくつかのパフォーマンス上の利点があり、トランザクションをサポートします(Linuxで実行し、バリアなしのxfsと期限スケジューラを使用します)。

しかし、実際にそれを飛ばすには、ハードウェアを調べる必要があります。

3
symcbean

私の経験から、InnoDB(適切に構成および使用されている場合)はMyISAMよりも少し遅いだけです(確かに桁違いではありません)。パフォーマンスを向上させるために、いくつかの提案が思い浮かびます。

  • MySQLInnoDBストレージエンジンの最新バージョンを使用する必要があります。
  • 大きなバッファプールサイズ(最大80%の使用可能なRAM)と大きなログファイルサイズを使用する必要があります。
  • 高スループットを得るには、トランザクションとバッチ挿入を使用する必要があります。バッチサイズは重要なパフォーマンス要因です(小さすぎず大きすぎない)。
  • AUTOINCREMENTidを主キーとして使用する必要があります。インデックスを使用すると、特にUNIQUEの挿入速度が低下します。
  • 自分に合った最低のトランザクション分離レベルを使用する必要があります。
  • システムに合わせてinnodb_flush_methodを調整します。
  • 完全なACID保証が必要ない場合は、innodb_flush_logs_at_trx_commitの値を変更することを検討してください
  • 適切なハードウェアを使用し、OS /ストレージ/ファイルシステムを調整します

ここに良いポインタがあります:

2
Vlad

非常に非常に高速なDB: MemSQL

0
mnmnc

innodbを微調整するために使用できるパラメーターはたくさんあります。その量のデータのmyisamは不適切です。たとえば、クラッシュ後に修復する必要があります。

mysqltuner または perconaのSQL構成ウィザード ;を見てください。たくさんのRAMと高速のio-subsystemをその上に投げると、innodbは非常にまともなパフォーマンスを提供できます。

innodbは データのオンザフライ圧縮 を許可します。処理速度は向上しませんが、ストレージスペースを節約できます。

選択したデータベースエンジンに関係なく:

  • 挿入物をバッチ処理してみてください。可能であれば、データプロデューサーとデータベースの間にキューイングシステムを用意してください。
  • データのシャーディングについて考えてください
  • 挿入プロセスの並列化について考えてください。 myisamには役立ちませんが、mysqlやその他のデータベースサーバーでinnodbを使用するとパフォーマンスが向上します。
0
pQd