我有一个负载相当高的项目,在 MySQL 上运行,有大约 10M 条记录,每秒大约有 500 个请求。数据相当独特,缓存命中率只有3%左右。每行大约有 10 个字段,其中 2 个已建立索引。我的查询 99% 使用这两个索引字段来请求。
我决定尝试 NoSQL,MongoDB 是理所当然的。移动数据非常简单,只需使用简单的定制脚本即可。数据库架构保持完全相同,我复制了相同的两个索引字段,它们仍然负责 90% 的请求。然后我决定尝试一下,结果非常震惊:MongoDB 回答查询的速度非常非常慢。响应率从每秒 5 到 10 个请求不等,而 mysql 的响应率为 500 个。
有什么想法为什么会发生这种情况吗?正常吗?在这种特殊情况下(10M 记录,大量唯一请求,缓存命中率低),我是否应该期望 MongoDb 优于 Mysql?我感觉我漏掉了一点。
UPDATE有一些规格
我测试的服务器是四核 Xeon 和 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`)
典型的查询是:
从表中选择 var2、var4、var5、var6,其中 var7=xxx 且 var6=yyy
通过比较使用索引字段和非索引字段的查询,我手动验证了 MongoDB 是否正确复制了相同的索引。
UPDATE2MongoDB .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"
}
]