創(chuàng)建固定集合
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、廣豐網(wǎng)站維護(hù)、網(wǎng)站推廣。
db.createCollection(“my_collection”,{capped:true,size:10000,max:5})
把普通集合轉(zhuǎn)行成固定集合
db.runCommand({convertTocapped:”test”,size:10000})
GridFS是一種在MongoDB中存儲(chǔ)大二進(jìn)制文件的機(jī)制,使用GridFS可以存儲(chǔ)以下幾種文件:
儲(chǔ)存巨大的文件,比如視頻、高清圖片等
好處:
利用GridFS可以簡(jiǎn)化需求。
GridFS會(huì)直接利用已經(jīng)建立的復(fù)制或分片機(jī)制,故障恢復(fù)和擴(kuò)展都很容易
GridFS可以避免用戶上傳內(nèi)容的文件系統(tǒng)出現(xiàn)問(wèn)題。
GridFS不產(chǎn)生磁盤(pán)碎片
GridFS使用兩個(gè)表來(lái)存儲(chǔ)數(shù)據(jù):
files 包含元數(shù)據(jù)對(duì)象
chunks 包含其他一些相關(guān)信息的二進(jìn)制塊
[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 存儲(chǔ)的是文件的相關(guān)信息,fs.chunks存儲(chǔ)是的文件,并且是二進(jìn)制格式的。
查看存儲(chǔ)文件信息
[root@a2 bin]# ./mongofiles list
connected to: 127.0.0.1
mongosniff.tar.gz 7171743
獲取存儲(chǔ)文件:
[root@a2 bin]# ./mongofiles get mongosniff.tar.gz
系統(tǒng)性能優(yōu)化:
建立索引,
當(dāng)創(chuàng)建collection時(shí),系統(tǒng)會(huì)自動(dòng)建立一個(gè)_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});(如果數(shù)據(jù)量大,可以使用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})
如果再輸入的數(shù)據(jù)name字段有重復(fù)的話,就會(huì)報(bào)錯(cuò),如下:
> 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 提供了一個(gè)explain命令讓我們獲知系統(tǒng)如何處理查詢請(qǐng)求
> db.c2.find({age:{$gt:26}}).explain();
{
"cursor" : "BtreeCursor age_1",
"isMultiKey" : false,
"n" : 3, 返回的數(shù)據(jù)數(shù)
"nscannedObjects" : 3,
"nscanned" : 3, 被掃描的文檔數(shù),因?yàn)樽隽薬ge字段的索引
"nscannedObjectsAllPlans" : 3,
"nscannedAllPlans" : 3,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 1, 耗時(shí)(毫秒)
"indexBounds" : { 所使用的索引
"age" : [
[
26,
1.7976931348623157e+308
]
]
},
"server" : "a1:27017"
}
MongoDB Database Profiler 是一種慢查詢?nèi)罩竟δ埽梢宰鳛槲覀儍?yōu)化數(shù)據(jù)庫(kù)的依據(jù)。
開(kāi)啟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參數(shù)
優(yōu)化方案:
1:創(chuàng)建索引 db.posts.ensureIndex({ts:1});
2: 限定返回結(jié)果條數(shù) db.posts.find().sort({ts:-1}).limit(10);
3: 查詢使用到的字段,不查詢所有字段
4: 采用cappedcollection
capped Collections比普通Collections的讀寫(xiě)效率高
5: 采用Profiling
Mongosniff此工具可從底層監(jiān)控到底有哪些命令發(fā)送給MongoDB去執(zhí)行。
執(zhí)行這個(gè)命令可能會(huì)出現(xiàn)如下錯(cuò)誤
[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
由于系統(tǒng)自動(dòng)安裝的是 1.0版本,所以我們還必須建立個(gè)軟連接
ln -s /usr/lib64/libpcap.so.1.0.0 /usr/lib64/libpcap.so.0.9
使用方法:
[root@a1 bin]# ./mongosniff --source NET lo
sniffing... 27017
可以將這些數(shù)據(jù)輸出到一個(gè)日志文件中,那么就可以保留下所有數(shù)據(jù)庫(kù)操作的歷史記錄,對(duì)于后期的性能分析和安全審計(jì)等工作將是一個(gè)巨大的貢獻(xiàn)。
Mongostat
此工具可以快速的查看某組運(yùn)行中的MongoDB 實(shí)例的統(tǒng)
計(jì)信息,也需要在打開(kāi)一個(gè)客戶端進(jìn)行命令操作:
用法如下:
[root@localhost bin]# ./mongostat
查看數(shù)據(jù)庫(kù)的狀態(tài):
> 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
}