2

我有一个负载相当高的项目,在 MySQL 上运行大约 10M 记录,每秒大约有 500 个请求。数据非常独特,缓存命中率只有 3% 左右。每行有大约 10 个字段,其中 2 个被索引。我 99% 的查询使用两个索引字段进行请求。

我决定尝试使用 NoSQL,而 MongoDB 是明智之举。使用简单的自定义脚本移动数据非常容易。数据库模式保持完全相同,我复制了相同的两个索引字段,它们仍然负责 90% 的请求。然后我决定试一试,非常震惊:MongoDB 对查询的回答非常非常慢。响应率从每秒 5 到 10 个请求不等,而 mysql 则为 500 个。

任何想法为什么会发生这种情况?正常吗?我是否应该期望 MongoDb 在这种特殊情况下胜过 Mysql(10M 记录,大量具有低缓存命中率的独特请求)?我觉得我错过了一点。

更新一些规格

我正在测试的服务器是具有 4GB 内存的四核至强

MySQL表是(重命名的字段名):

  CREATE TABLE `table` (
  `recordid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `var1` varchar(200) DEFAULT NULL,
  `var2` char(32) DEFAULT NULL,
  `var3` bigint(20) unsigned DEFAULT NULL,
  `var4` smallint(5) unsigned DEFAULT NULL,
  `var5` datetime DEFAULT NULL,
  `var6` int(10) unsigned NOT NULL,
  `var7` int(10) unsigned NOT NULL,
  `var8` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`recordid`),
  UNIQUE KEY `recordid_UNIQUE` (`recordid`),
  KEY `keyvar7` (`var7`),
  KEY `keyvar6` (`var6`)

典型的查询是:SELECT var2, var4, var5, var6 from table where var7=xxx and var6=yyy

通过比较使用索引字段和非索引字段的查询,我手动验证了 MongoDB 是否正确复制了相同的索引。

UPDATE2 MongoDB .getIndexes() 回复

  > db.table.getIndexes();
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "table.table",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "var6" : 1
        },
        "ns" : "table.table",
        "name" : "var6_1"
    },
    {
        "v" : 1,
        "key" : {
            "var7" : 1
        },
        "ns" : "table.table",
        "name" : "var7_1"
    }
]
4

4 回答 4

5

MongoDB 不是一个神奇的查询加速器。您的网站不会因为您切换到 mongo 而承受 10 倍的负载。

从你的数字来看,我怀疑正在发生资源饱和。MySQL 当然可以做很多超过 500 QPS。

你知道你的瓶颈是什么吗?我敢打赌,您的 RAM 比所需的要少得多,必须从磁盘中获取数据并且磁盘已饱和。在这一点上,没有数据库技术可以帮助你,除非你得到更多的铁(或删除一些数据)。

至于 mongo 的性能较差,没有具体情况很难说。

于 2012-06-13T20:47:19.413 回答
1

如果您要查询示例中的两个元素,请在和上SELECT var2, var4, var5, var6 from table where var7=xxx and var6=yyy使用复合索引var7var6

如果你有一个固定的结构并使用与关系数据库相同的模式,我怀疑你是否能够获得很多。但你可能会让情况变得更糟;-)

于 2012-06-13T22:10:59.050 回答
0
  • 您是否正确设置了所有索引?包括复合索引?
  • 并且这些集合实际上是否被索引?

    例如 Collectionname.indexes ;Collectionname.create_indexes

  • 你可以分片你的数据或使用多个从站来分散负载吗?

  • 你的系统有多少内存?
于 2012-06-13T21:05:47.483 回答
0

考虑到许多大型网络项目都坚持使用 mysql,例如 Facebook 等。因此,只要新数据库已针对您的需求进行了测试,您就不应该这样做。我最喜欢做的是获取数据库的最新备份并移回 mysql,然后将memcached 系统调整到您的数据库,它确实可以处理大量流量。

但当然,您还没有指定项目的类型,无论是 Web 还是某个应用程序。MongoDB 比 mysql 慢得多。
向我们提供搬家详情,我们将能够为您提供帮助并提供更多信息。

于 2012-06-13T20:57:50.547 回答