NoSql:not only sql 非關系型數據庫 面向對象式的 新浪微博:redis google :bigtable amazon:simpledb 淘寶:tair 視覺網站:mongodb 優酷運營數據分析:mongodb 飛信空間:handlersocket 豆瓣社區:beansdb 優缺點: 優點: 簡單的擴展 快速的讀寫 低廉的成本 靈活的數據模型 缺點: 只是在局部展現出某些優勢 不提供對sql的支持 支持的特性不夠豐富 現有的產品不夠成熟 相對成熟的產品 mongodb,redis 是一個面向集合的,模式自由的文檔型數據庫 面向集合: 文件存儲格式:bson(二進制的json) 使用場景: 持久化的緩存層 高效的實時性 用於對象以及json數據的存儲 高伸縮性的場景 大尺寸,低價值的數據存儲 不適用: 高度事務 傳統的商業智能應用 復雜的多表查詢 安裝簡單: 不需要編譯 啟動: 建立數據庫目錄:data 日志文件:dblogs E:\mongodb\bin\mongod.exe --dbpath=e:\mongodb\data --logpath=e:\mongodb\dblogs --install 默認進入:test庫 關閉:kill -all 進程號 pkill 進程名 不要用kill -9 否則會產生鎖文件 命令: show dbs exit db 當前數據庫 show tables /show collections 當前數據庫的集合 對比: mysql 數據庫(database) 表(table) 記錄(rows) mongodb 數據庫(database) 集合(collection) 文檔對象(document) 隱式創建數據庫和表: db.c1.insert({name:"songjiankang"}); db.c1.find() show users 查看所有用戶 db.dropdatabase() db.c1.remove(); //刪除所有 db.c1.update({name:"user1"},{name:"user00"}) objectid:時間+機器號+進程號+編號 即使把多個集合的數據完全合並都不會沖突 數據類型: null {"one":null} 布爾 {"one":true} 32位整數 64位的整數 64位的浮點數 字符串 符號 objectId類型 對象id是文檔中唯一的12位的id 0|1|2|3|4|5|6|7|8|9|10|11 時間戳 機器 pid 計數器 日期 {"one":newDate()} 正則 代碼 文檔中可以包含js代碼{"one":function(){}} 數組:值可以為數組 還可以嵌套{"one":["a",["b","c"]]} 內嵌文檔 文檔可以包含別的文檔,也可以作為值嵌入到父文檔中 {"x":{"name":"jian"}} insert save(replace) js 動態插入 for(i=0;i<10;i++){ ... db.c1.insert({user:'name'+i}); ... } //取哪些字段(要的為1,不要的為0,默認會取出_id) db.c1.find({user:"name1"},{user:1,_id:0}); db.c1.find({age:{$gt:5}}); db.c1.find({age:{$lte:5}}); db.c1.find({age:{$ne:5}}); db.c1.count(); db.c1.find().sort({age:-1});//降序 db.c1.find().sort({age:1});//升序 db.c1.find().limit(8)//取多少個 db.c1.find().skip(10).limit(8)//取多少個 db.c2.find({age:{$all:[1,2,4,4444]}});//包含 db.c2.find({age:{$exists:1}});//檢測字段是否存在 db.c2.find({age:{$mod:[2,1]}});//取余操作 db.c1.update({name:"user1"},{name:"user2"});//當有滿足前面的條件的時候時,直接更新,當不滿足前面的條件時,如果有第三個參數1,則會當一條新記錄插入進去 db.c1.update({name:10},{$set:{name:100}},0,1);//更新全部符合條件的記錄 db.c1.update({name:100},{$set:{age:1000}},0,1);//把滿足條件的增加age字段 db.c1.update({"age":50},{$inc:{"ages":100}},0,1); //$set $inc 在字段沒有的情況下都會自動增加字段,當條件存在時第三個參數不起作用,第四個參數代表更新記錄的行數 db.c1.update({},{$unset:{ages:1}},0,1);//去除多余的字段 db.c1.update({name:"user1"},{$push:{arr:5}});//在val是數組的里面增加值,一次只能增加一個 db.c1.update({name:"user1"},{$pushAll:{arr:[7,8,9]}});//在val是數組的里面增加值,一次只能增加一個 db.c1.update({name:"user1"},{$pop:{arr:1}});//值為數組的減去一個值 $addToSet 同$push 類似,只是前者會檢測重復性 db.c1.update({name:"user1"},{$addToSet:{arr:{$each:[1,2,,3,4,5,6]}}});//壓入一個數組並檢測其重復性 db.c1.update({name:"user1"},{$pull:{arr:1}});//刪除數組中值為1的元素 db.c1.update({name:"user1"},{$pullAll:{arr:[2,3,4]}});//一次性刪除數組中多個元素 db.c1.update({name:"user1"},{$rename:{"name":"kang"}},0,1);//重命名key { "_id" : ObjectId("50358b45c3fec12531a5f899"), "arr" : [ { "class" : "php" }, { "class" : "mysql" }, { "class" : "java" }, { "class" : "javascript" }, { "class" : "java" } ], "name" : "user1" } 查找上面的記錄: db.c1.find({"arr.class":"java"}); db.c1.update({"name.user1":'a'},{$set:{"name.$.user1":"aaaaaaaaaaaa"}});//注意:連寫的key都要引起來 var x = db.c1.findOne({"user":"user1"});//x相當於一個json對象 可以用x來動態修改 x.age = 10; db.c1.save(x);//修改到對象中 ———————————————————————————————————————————————————————————————————— db.c1.drop();//刪除表 db.stats(); db.dropDatabase();//刪除當前數據庫 use test;有的進入,沒有則創建 db.createCollection("c2");//顯式創建集合 —————————————————————————————————————————————————————————————————————————— 普通集合:動態增長 固定集合:可以更新,但不可以超過總大小,不允許刪除,但可以drop()刪除所有的行,drop后需要顯式的重建集合,32位機器上一耳光capped collection的最大值約482.5M,64位上只受系統文件大小的限制 好處: 插入速度極快 按照插入順序的查詢輸出速度極快 能夠在插入最新數據時,淘汰最早的 用處:存儲日志信息 緩存一些少量的文檔 創建固定集合(必須顯式創建):db. db.createCollection("c3",{capped:true,size:10000,max:3});(沒有索引) 先根據容量限制進行淘汰,在根據文檔個數限制進行淘汰 普通轉固定集合: db.runCommand({convertToCapped:"c1",size:100000,max:3}); gridfs:用來存儲大的二進制文件 存儲巨大文件:視頻高清圖片 利用gridfs可以簡化需求 直接利用已經建立的復制或分片機制,故障恢復和擴展都很容易 避免用戶上傳內容的文件系統出現問題 不產生碎片 fs.files 上傳文件的基本信息 fs.chunks 二進制文件 db.fs.chunks.find(); db.fs.files.find(); mongofiles list / get/ put /delete md5sum mongo//計算md5值 ___________________________________________________________________ 索引: system.indexes索引 db.fs.files.drop(); db.fs.chunks .drop(); db.c1.find().explain();//查看是否用到索引 db.c1.ensureIndex({name:1}) //name上建立索引 1為升序,-1為降序 db.c1.getIndexKeys();//查看索引狀態 db.c1.getIndexes()//詳細查看 db.c1.ensureIndex({age:1},{unique:1});//建立唯一索引: db.c1.dropIndex({"name":1});//刪除索引 db.c1.dropIndexes(); //刪除所有索引 優化器:profile慢查詢工具 1.開啟方式:db.setProfilingLevel(2);//0:不開啟,1:記錄慢命令(默認100ms),2:記錄所有命令 查看是否開啟慢查詢:db.getProfilingLevel(); db.systme.profile().find().sort({$natural:-1}).limit(1); ts:時間 info:命令的詳細信息 reslen:返回結果集的大小 nscanned:本次查詢掃描的記錄數 nreturn:本次查詢實際返回的結果集 millis:耗時(毫秒) show Profile可列出最近5條超過1ms的記錄 限制返回的條數:db.c1.find().sort({ts:-1}).limit(10); 查詢指定的字段:db.c1.find({},{ts:1,title:1}).sort({ts:-1}).limit(10); 性能監控工具(監視網絡情況): /usr/local/mongodb/bin/mongosniff --source net lo /usr/local/mongodb/bin/mongostat 數據的導出:/usr/local/mongodb/bin/mongoimport -d test -c c1 -o /tmp/song.data 導入:/usr/local/mongodb/bin/mongoimport -d test -c c1 /tmp/song.data 備份數據庫: ./mongodump -d test -o /tmp/ 回復數據庫: ./mongorestore -d test /tmp/test 用戶和授權: 默認不進行驗證 兩類用戶:超級用戶,每個數據庫的用戶 默認用戶超級管理員登陸 /usr/local/mongodb/bin/mongod --auth -dbpath=/usr/local/mongodb/data -logpath=/usr/local/mongodb/dblogs --profile 2 & (授權登陸) 啟動的時候帶 --auth 登陸才受限制 //設定用戶以后,匿名用戶就沒有權限了 use admin(注意admin里面的為超級管理員--特殊) db.addUser("root",123456);//增加用戶 db.auth("root",123456); 登陸的時候必須指定指定數據庫的指定用戶 /usr/local/mongodb/bin/mongo -u root -p 123456 localhost:27017/admin 主從集群: master-slave主從復制 replica sets復制(副本集) 當有一台宕機以后,會發組播從新選舉出一台住服務器 實驗(主從復制): 啟動主: master: /usr/local/mongodb/bin/mongod --master -dbpath=/usr/local/mongodb/data1 --logpath=/usr/local/mongodb/dblogs1 --port 20000 & 啟動從: /usr/local/mongodb/bin/mongod --slave --source 127.0.0.1:20000 -dbpath=/usr/local/mongodb/data2 --logpath=/usr/local/mongodb/dblogs2 --port 20001 & ______________________________________________________________ 副本集: 啟動多個(只是配置文件不同) 1》 ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/key1 --port 20000 --dbpath=/usr/local/mongodb/data/data1/ -logpath=/usr/local/mongodb/log/log1 --fork 2》登陸一個,然后配置下(會議清單) config_rs1={ _id:"rs1", members:[ {_id:0,host:"localhost:20000",priority:1}, {_id:1,host:"localhost:20001",priority:2} ] } rs.initiate(config_rs1);//初始化配置 從的需要 rs.slaveOk();才可以查看 安裝mogo php擴展: 打模塊 1.解壓模塊,在目錄下運行/bin/phpize 2. ./configure --with-php-config=/www/wdlinux/php/bin/php-config --enable-mongo 3.make && make install 4.php.ini中添加模塊的路徑 1>extension_dir = "/www/wdlinux/nginx_php-5.2.17/lib/php/extensions/no-debug-zts-20060613" 2>extension=mongo.so 以授權方式連接mongodb:"mongodb://root:123456@localhost:27017/admin" $conn = new Mongo("mongodb://root:123456@localhost:27017/admin"); $db = $conn->test; $c1 = $db->c1; $arr = array(); $res = $c1->find($arr); foreach($res as $val){ print_r($val); }
