最适合我的应用程序types的数据库? MySQL的? MongoDB的? PostgreSQL的? CouchDB的?

我目前正在写一个应用程序,我必须存储大量的数据。 我的应用程序是用Node.js编写的,使用集群和asynchronous模块来使用我的完整系统。

以下是我的应用程序和我正在使用的环境的一些属性:

工作站:

  • CPU:3.5 GHz的核心
  • 内存:16 GB
  • Nodejs:最新版本
  • 当前数据库:MySQL
  • 操作系统:Windows 10

应用:

  • 目前正在使用6个工人,每个人占用0.1%的CPU和80 MB的RAM
  • 通过JSON格式的RPC调用获取数据库的数据

数据:

  • 街区(目前约376,000街区)每增加10分钟一街。 一个块的示例数据:

    { "hash" : "000000000fe549a89848c76070d4132872cfb6efe5315d01d7ef77e4900f2d39", "confirmations" : 88029, "size" : 189, "height" : 227252, "version" : 2, "merkleroot" : "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a", "tx" : [ "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a" ], "time" : 1398824312, "nonce" : 1883462912, "bits" : "1d00ffff", "difficulty" : 1.00000000, "chainwork" : "000000000000000000000000000000000000000000000000083ada4a4009841a", "previousblockhash" : "00000000c7f4990e6ebf71ad7e21a47131dfeb22c759505b3998d7a814c011df", "nextblockhash" : "00000000afe1928529ac766f1237657819a11cfcc8ca6d67f119e868ed5b6188" } 

    • 交易(目前约84,850,717笔交易)每秒增加约1.3笔交易。 一个事务的示例数据:
 { "hex" : "0100000001268a9ad7bfb21d3c086f0ff28f73a064964aa069ebb69a9e437da85c7e55c7d7000000006b483045022100ee69171016b7dd218491faf6e13f53d40d64f4b40123a2de52560feb95de63b902206f23a0919471eaa1e45a0982ed288d374397d30dff541b2dd45a4c3d0041acc0012103a7c1fd1fdec50e1cf3f0cc8cb4378cd8e9a2cee8ca9b3118f3db16cbbcf8f326ffffffff0350ac6002000000001976a91456847befbd2360df0e35b4e3b77bae48585ae06888ac80969800000000001976a9142b14950b8d31620c6cc923c5408a701b1ec0a02088ac002d3101000000001976a9140dfc8bafc8419853b34d5e072ad37d1a5159f58488ac00000000", "txid" : "ef7c0cbf6ba5af68d2ea239bba709b26ff7b0b669839a63bb01c2cb8e8de481e", "version" : 1, "locktime" : 0, "vin" : [ { "txid" : "d7c7557e5ca87d439e9ab6eb69a04a9664a0738ff20f6f083c1db2bfd79a8a26", "vout" : 0, "scriptSig" : { "asm" : "3045022100ee69171016b7dd218491faf6e13f53d40d64f4b40123a2de52560feb95de63b902206f23a0919471eaa1e45a0982ed288d374397d30dff541b2dd45a4c3d0041acc001 03a7c1fd1fdec50e1cf3f0cc8cb4378cd8e9a2cee8ca9b3118f3db16cbbcf8f326", "hex" : "483045022100ee69171016b7dd218491faf6e13f53d40d64f4b40123a2de52560feb95de63b902206f23a0919471eaa1e45a0982ed288d374397d30dff541b2dd45a4c3d0041acc0012103a7c1fd1fdec50e1cf3f0cc8cb4378cd8e9a2cee8ca9b3118f3db16cbbcf8f326" }, "sequence" : 4294967295 } ], "vout" : [ { "value" : 0.39890000, "n" : 0, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 56847befbd2360df0e35b4e3b77bae48585ae068 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a91456847befbd2360df0e35b4e3b77bae48585ae06888ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "moQR7i8XM4rSGoNwEsw3h4YEuduuP6mxw7" ] } }, { "value" : 0.10000000, "n" : 1, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 2b14950b8d31620c6cc923c5408a701b1ec0a020 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a9142b14950b8d31620c6cc923c5408a701b1ec0a02088ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN" ] } }, { "value" : 0.20000000, "n" : 2, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 0dfc8bafc8419853b34d5e072ad37d1a5159f584 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a9140dfc8bafc8419853b34d5e072ad37d1a5159f58488ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe" ] } } ], "blockhash" : "00000000103e0091b7d27e5dc744a305108f0c752be249893c749e19c1c82317", "confirmations" : 88192, "time" : 1398734825, "blocktime" : 1398734825 } 

问题: MySQL数据库正在将CPU推到100%,而只使用500MB的RAM。 我的瓶颈是目前的MySQL数据库,它无法处理我的应用程序的速度和数据量,并占用了大量的CPU资源。

我在找什么:

  • 一个数据库可以处理我的应用程序,即使我增加工人的数量

    • 应该很容易检索信息并select具有依赖关系的数据。 (块通过tx < – > txid值具有到事务的连接)

    • 由于数据的稳步增长,未来应该能够保存更多的数据

    • 需要同时由多名工作人员访问

    • 奖金:数据更改时,将通知(频道)分配给我的应用程序

我希望有人能给我一个build议,哪个数据库适合我的项目types,并给我一个猜测所需的存储量。

你可以build议我另一个数据库,我没有在标题中提到。

关系数据库是非常有用的,当事情之间有很多关系的时候,特别是当你想在查询的时候遍历这些关系的时候。 例如,您可能有一批客户,每个客户都有多个订单,这些订单都来自供应商,这些订单都在位置上; 您可能需要查询所有在特定位置有至less五个供应商订单的客户。 或者,也许你想知道来自供应商的订单总数,按地点分组。 关系数据库在这方面非常出色。

你的数据确实有关系,是的。 但是,这听起来好像你并没有计划试图遍历它们,或者非常聚合它们,而且一旦存储了,你的数据将很less发生变化。 这听起来像一个文件商店会更适合你。

在列出的数据库中,MongoDB和Redis可以被视为文档商店。 你说你只有512 MB的RAM; 那种不喜欢把Redis的所有数据存储在RAM中的Redis,只是把它扔到磁盘上而已。 我不确定MongoDB试图取得什么样的平衡,但是我相信虽然它有些宽松地使用RAM,但是它最终还是试图把它存入磁盘。 (有些人嘲笑它,说它不会在耐用性上下功夫,看起来你正在存储公开的数据,所以这不应该是一个太大的问题 – 如果你失去了一些最大的数据,最近写的数据,你可以从公共来源重新填充。)

您在评论中指出,您通常会查询块中的所有交易。 MongoDB应该能够轻松处理这个用例。 唯一需要确定的是你在块ID列(字段?我不确定MongoDB叫什么)上创build一个索引,这将允许有效地执行这种查询。