我的应用类型的最佳数据库? MySQL的? MongoDB的? PostgreSQL的? CouchDB的?

时间:2015-09-22 00:04:57

标签: mysql node.js mongodb postgresql redis

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

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

工作站:

  • CPU:3.5 GHz的6个核心
  • RAM: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能力。

我在寻找什么:

  • 即使我增加工人数量也能处理我的申请的数据库

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

    • 由于数据的稳定增长,未来应能保留更多数据

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

    • 奖励:数据更改时向我的应用程序发送通知(通道)

我希望有人能给我一个建议,哪个数据库适合我的项目类型,并且可能会猜测所需的存储量。

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

1 个答案:

答案 0 :(得分:4)

当你在事物之间有很多关系时,关系数据库很有用,特别是当你想在查询时遍历这些关系时。例如,您可以拥有一大批客户,每个客户都有多个订单,这些订单都来自供应商,这些订单位于各个位置;您可能希望查询在特定位置至少有五个订单来自供应商的客户。或者您可能想知道供应商的订单总数,按地点分组。关系数据库非常出色。

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

在您列出的数据库中,MongoDB和Redis可以被视为文档存储。你说你只有512 MB的RAM;这种取消资格的Redis,它喜欢将所有的数据存储在RAM中,并将其作为事后的想法扔到磁盘上。我不确定MongoDB试图达到什么平衡,但我相信虽然它有点自由地使用RAM,但它最终也会尝试将它放到磁盘上。 (有些人嘲笑它,说它不会在耐用性方面做得很努力。看起来你正在存储公开的数据,所以这不应该是一个太大的问题 - 如果你失去了一些 - 最近编写的数据,你可以从公共资源中重新填充它。)

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