我有一个负载相当高的项目,在 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"
}
]