MySQL和MongoDB的性能测试
软硬件环境
MySQL版本:5.1.50,驱动版本:5.1.6(最新的5.1.13有很多杂七杂八的问题)
MongoDB版本:1.6.2,驱动版本:2.1
操作系统:Windows XP SP3(这个影响应该不大)
CPU:Intel Core2 E6550 2.33G
内存:2G(足够了)
MySQL启动参数:bin\mysqld --no-defaults --console --character-set-server=utf8 --max_connections=1000 --max_user_connections=1000
MongoDB启动参数:bin\mongod --dbpath data\ --directoryperdb --rest --maxConns 1000 –quiet
除了加大最大连接数之外,均使用默认参数
测试
该测试主要为改进当前系统的日志的存储和查询性能提供参考,所以表的创建也以实际情况为例,下面是MySQL的建表语句:
CREATE TABLE `flt_evecurrent` ( `NodeID` int(11) NOT NULL DEFAULT '0', `FltID` int(11) NOT NULL DEFAULT '0', `ObjID` int(11) DEFAULT NULL, `StationID` int(11) DEFAULT NULL, `EveType` int(11) DEFAULT NULL, `Severity` int(11) DEFAULT NULL, `ReportTime` date DEFAULT NULL, `CreateTime` date DEFAULT NULL, `EveContent` varchar(1024) DEFAULT NULL, `EveDesc` varchar(256) DEFAULT NULL, PRIMARY KEY (`NodeID`,`FltID`) ); |
MongoDB类似,索引按照查询语句的查询字段创建,该例子中为ObjID和CreateTime两个字段创建索引。
分别插入100万条记录,并对其做100个用户并发查询操作。
MySQL每一次都Drop表,MongoDB每一次都删除data目录。
查询的时候,从第二次查询开始,连续记录三次。
结果
|
插入时间 |
查询时间 |
MySQL InnoDB引擎 无索引 |
10分33秒 |
39.516秒、35.907秒、39.907秒 |
MySQL InnoDB引擎 有索引 |
11分16秒 |
非常不稳定:22.531秒、13.078秒、23.078秒、26.047秒、21.234秒、28.469秒、20.922秒、13.328秒 |
MySQL MyISAM引擎 无索引 |
3分21秒 |
22.812秒、23.343秒、23.125秒 |
MySQL MyISAM引擎 有索引 |
3分50秒 |
10.312秒、10.359秒、10.296秒 |
MongoDB无索引 |
37秒 |
59.531秒、60.063秒、59.891秒 |
MongoDB有索引 |
50秒 |
3.484秒、3.453秒、3.453秒 |
磁盘空间占用(有索引时候的占用,无索引情况差不多):
MySQL MyISAM:57MB
MySQL InnoDB:264MB
MongoDB:464MB
另外测试中还发现一个有意思的现象,如果MongoDB查询中,如果单独查询ObjID字段,耗时约1秒,如果单独查询CreateTime字段,耗时约10秒,如果两个字段合起来查,就是上面的结果,约3秒,估计MongoDB内部对查询顺序作了优化吧。