mongodb 系统性能篇(1)
创建固定集合
db.createCollection("my_collection",{capped:true,size:10000,max:5})
把普通集合转行成固定集合
db.runCommand({convertTocapped:"test",size:10000})
GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS可以存储以下几种文件:
储存巨大的文件,比如视频、高清图片等
好处:
利用GridFS可以简化需求。
GridFS会直接利用已经建立的复制或分片机制,故障恢复和扩展都很容易
GridFS可以避免用户上传内容的文件系统出现问题。
GridFS不产生磁盘碎片
GridFS使用两个表来存储数据:
files 包含元数据对象
chunks 包含其他一些相关信息的二进制块
[root@a2 bin]# ./mongofiles put mongosniff.tar.gz
[root@a2 bin]# ./mongo
MongoDB shell version: 2.4.3
connecting to: test
> show tables;
fs.chunks
fs.files
system.indexes
> db.fs.files.find();
{ "_id" : ObjectId("5196601b171c296452c1f9f1"), "filename" : "mongosniff.tar.gz", "chunkSize" : 262144, "uploadDate" : ISODate("2013-05-17T16:51:40.843Z"), "md5" : "5067d9e1c4a0e41b93f204a72ec52794", "length" : 7171743 }
>
fs.files 存储的是文件的相关信息,fs.chunks存储是的文件,并且是二进制格式的。
查看存储文件信息
[root@a2 bin]# ./mongofiles list
connected to: 127.0.0.1
mongosniff.tar.gz 7171743
获取存储文件:
[root@a2 bin]# ./mongofiles get mongosniff.tar.gz
系统性能优化:
建立索引,
当创建collection时,系统会自动建立一个_id的索引,而且不能删除
> db.system.indexes.find();
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.c1", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.c2", "name" : "_id_" }
建立普通索引
> db.c2.ensureIndex({age:1},{true});(如果数据量大,可以使用background,age:1表示索引按age的升序排列,-1为降序)< /p>
> db.system.indexes.find();
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.c1", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.c2", "name" : "_id_" }
{ "v" : 1, "key" : { "age" : 1 }, "ns" : "test.c2", "name" : "age_1", "background" : true }
建立唯一索引
> db.c2.ensureIndex({name:1},{unique:true})
如果再输入的数据name字段有重复的话,就会报错,如下:
> db.c2.insert({name:"user0"})
E11000 duplicate key error index: test.c2.$name_1 dup key: { : "user0" }
删除所有索引
> db.c2.dropIndex();
删除name字段的索引
> db.c2.dropIndex({name:1})
MongoDB 提供了一个explain命令让我们获知系统如何处理查询请求
> db.c2.find({age:{$gt:26}}).explain();
{
"cursor" : "BtreeCursor age_1",
"isMultiKey" : false,
"n" : 3, 返回的数据数
"nscannedObjects" : 3,
"nscanned" : 3, 被扫描的文档数,因为做了age字段的索引
"nscannedObjectsAllPlans" : 3,
"nscannedAllPlans" : 3,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 1, 耗时(毫秒)
"indexBounds" : { 所使用的索引
"age" : [
[
26,
1.7976931348623157e+308
]
]
},
"server" : "a1:27017"
}
MongoDB Database Profiler 是一种慢查询日志功能,可以作为我们优化数据库的依据。
开启profile功能:
(1)> db.setProfilingLevel(2);
{ "was" : 0, "slowms" : 100, "ok" : 1 }
(2)[root@a1 bin]# ./mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs -profile=2 --fork
添加 -profile参数
优化方案:
1:创建索引 db.posts.ensureIndex({ts:1});
2: 限定返回结果条数 db.posts.find().sort({ts:-1}).limit(10);
3: 查询使用到的字段,不查询所有字段
4: 采用cappedcollection
capped Collections比普通Collections的读写效率高
5: 采用Profiling
Mongosniff此工具可从底层监控到底有哪些命令发送给MongoDB去执行。
执行这个命令可能会出现如下错误
[root@a1 bin]# ./mongosniff --help
./mongosniff: error while loading shared libraries: libpcap.so.0.9: cannot open shared object file: No such file or directory
解决方法:
yum -y install libpcap-devel
由于系统自动安装的是 1.0版本,所以我们还必须建立个软连接
ln -s /usr/lib64/libpcap.so.1.0.0 /usr/lib64/libpcap.so.0.9
使用方法:
[root@a1 bin]# ./mongosniff --source NET lo
sniffing... 27017
可以将这些数据输出到一个日志文件中,那么就可以保留下所有数据库操作的历史记录,对于后期的性能分析和安全审计等工作将是一个巨大的贡献。
Mongostat
此工具可以快速的查看某组运行中的MongoDB 实例的统
计信息,也需要在打开一个客户端进行命令操作:
用法如下:
[root@localhost bin]# ./mongostat
查看数据库的状态:
> db.stats();
{
"db" : "test",
"collections" : 6,
"objects" : 234,
"avgObjSize" : 263.77777777777777,
"dataSize" : 61724,
"storageSize" : 1077248,
"numExtents" : 6,
"indexes" : 4,
"indexSize" : 32704,
"fileSize" : 67108864,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"ok" : 1
}