我有相当高的加载项目,在MySQL上运行,记录大约有1000万条,每秒有大约500个请求。数据非常独特,缓存命中率仅为3%左右。每一行大约有10个字段,其中2个被索引。99%的查询对请求使用两个索引字段。
我决定试一试NoSQL,而MongoDB一点也不需要思考。移动数据非常容易,使用简单的定制脚本。数据库模式完全相同,我复制了相同的两个索引字段,它们仍然对90%的请求负责。然后我决定试一试,非常震惊: MongoDB对这些问题的回答非常非常慢。响应速率从每秒5次到10次不等,而mysql则是500次。
知道为什么会发生这种事吗?正常吗?在这种特殊情况下,我是否应该期望MongoDb优于Mysql (10m记录,大量缓存命中率较低的独特请求)?我觉得我漏掉了一点。
用一些规范更新
我正在用4GB ram的is核心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`)典型的查询是:从表中选择var2、var4、var5、var6,其中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"
}
]发布于 2012-06-13 20:47:19
MongoDB不是一个神奇的查询加速器。你的网站不会仅仅因为你切换到mongo而承受10倍的负载。
从你的数字来看,我怀疑已经出现了资源饱和。MySQL当然可以做很多超过500个QPS。
你知道你的瓶颈是什么吗?我敢打赌,您的RAM比需要的要少得多,数据必须从磁盘获取,磁盘才会饱和。此时,任何DB技术都不会帮助您,除非您获得更多的熨斗(或删除一些数据)。
至于芒果表现较差的问题,没有具体的说明是很难说的。
发布于 2012-06-13 22:10:59
如果您正在查询两个元素,如示例SELECT var2, var4, var5, var6 from table where var7=xxx and var6=yyy中的两个元素,则在var7和var6上使用复合指数。
如果您有一个固定的结构,并且使用与关系数据库相同的模式,我将怀疑您是否能够获得更多。但你可能会让事情更糟-)
发布于 2012-06-13 20:57:50
好吧,考虑到很多大型的web项目都坚持使用mysql,比如Facebook等等。因此,只要新DB已经针对您的需要进行了测试,就不应该这样做。我想让您做的是获取数据库的最新备份,然后移回mysql,然后将memcached系统调整到DB,它确实处理了大量的流量。
当然,您还没有指定项目的类型,无论是Web还是其他应用程序。MongoDB比mysql慢得多。
给我们移动的细节,我们将能够帮助您,并提供更多的信息。
https://stackoverflow.com/questions/11022980
复制相似问题