与具有10M记录的MySQL相比,MongoDB极其缓慢

bbb*_*oon 2 mongodb nosql

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

我决定尝试使用NoSQL,而MongoDB并不是那么简单.使用简单的自定义脚本移动数据非常简单.数据库模式保持完全相同,我复制了相同的两个索引字段,这些字段仍然对90%的请求负责.然后我决定尝试一下并且非常震惊:MongoDB非常非常缓慢地回答查询.响应速率从每秒5到10个请求变化,而使用mysql则为500.

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

更新一些规格

我测试的服务器是带有4GB内存的四核xeon

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`)
Run Code Online (Sandbox Code Playgroud)

典型的查询是:SELECT var2,var4,var5,var6 from table,其中var7 = xxx,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"
    }
]
Run Code Online (Sandbox Code Playgroud)

Ser*_*sev 5

MongoDB不是一个神奇的查询加速器.由于您切换到mongo,您的网站将无法承受10倍的负载.

从您的数字来看,我怀疑资源已经发生饱和.MySQL当然可以做到500 QPS以上.

你知道你的瓶颈是什么吗?我打赌你的内存比你需要的少得多,数据必须从磁盘中获取并且磁盘已经饱和.此时,除非您获得更多铁(或删除一些数据),否则没有DB技术会帮助您.

至于mongo的性能较差,没有具体细节很难说清楚.