首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与有10M记录的MongoDB相比,MySQL的速度非常慢

与有10M记录的MongoDB相比,MySQL的速度非常慢
EN

Stack Overflow用户
提问于 2012-06-13 20:42:02
回答 4查看 2.8K关注 0票数 2

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

我决定试一试NoSQL,而MongoDB一点也不需要思考。移动数据非常容易,使用简单的定制脚本。数据库模式完全相同,我复制了相同的两个索引字段,它们仍然对90%的请求负责。然后我决定试一试,非常震惊: MongoDB对这些问题的回答非常非常慢。响应速率从每秒5次到10次不等,而mysql则是500次。

知道为什么会发生这种事吗?正常吗?在这种特殊情况下,我是否应该期望MongoDb优于Mysql (10m记录,大量缓存命中率较低的独特请求)?我觉得我漏掉了一点。

用一些规范更新

我正在用4GB ram的is核心xeon测试服务器。

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

代码语言:javascript
复制
  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`)

典型的查询是:从表中选择var2、var4、var5、var6,其中var7=xxx和var6=yyy

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

UPDATE2 MongoDB .getIndexes()答覆

代码语言:javascript
复制
  > 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"
    }
]
EN

回答 4

Stack Overflow用户

发布于 2012-06-13 20:47:19

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

从你的数字来看,我怀疑已经出现了资源饱和。MySQL当然可以做很多超过500个QPS。

你知道你的瓶颈是什么吗?我敢打赌,您的RAM比需要的要少得多,数据必须从磁盘获取,磁盘才会饱和。此时,任何DB技术都不会帮助您,除非您获得更多的熨斗(或删除一些数据)。

至于芒果表现较差的问题,没有具体的说明是很难说的。

票数 5
EN

Stack Overflow用户

发布于 2012-06-13 22:10:59

如果您正在查询两个元素,如示例SELECT var2, var4, var5, var6 from table where var7=xxx and var6=yyy中的两个元素,则在var7var6上使用复合指数

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

票数 1
EN

Stack Overflow用户

发布于 2012-06-13 20:57:50

好吧,考虑到很多大型的web项目都坚持使用mysql,比如Facebook等等。因此,只要新DB已经针对您的需要进行了测试,就不应该这样做。我想让您做的是获取数据库的最新备份,然后移回mysql,然后将memcached系统调整到DB,它确实处理了大量的流量。

当然,您还没有指定项目的类型,无论是Web还是其他应用程序。MongoDB比mysql慢得多。

给我们移动的细节,我们将能够帮助您,并提供更多的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11022980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档