我在百X知道上回答問題時常常遇到相似與這樣的問題:MongoDB有沒有像MySQL同樣的ODBC驅動?MongoDB能不能像MySQL同樣獲取字段名稱或類型。html
個人回答是:不行,由於MongoDB不是MySQL。這個回答顯得MongoDB太弱了,個人原意是你不能要求一個物理優秀教師幫你輔導數學,也許他能作到基本的教學,但他很難作到優秀數學教師那麼全面。web
今天討論的問題是:批量插入和批量查詢sql
昨天在百X知道上有人問起MongoDB的批量插入如何寫,這個我還真沒用過,一方面MongoDB的速度足夠快讓我歷來沒有想過去找這種方法,另外一方面MongoDB的官網以及API裏也找不到這種方法。數據庫
那就帶來兩個問題。安全
問題1:這樣豈不是沒有速度更快的批量插入麼?性能
這個問題毫無技術含量,MongoDB怎麼可能會比MySQL慢?這裏仍是涉及到你們常常用到的傳統關係型數據庫和NoSQL的本質區別問題,NoSQL的每次操做都很是輕量級,小型化,除了數據的寫入外基本沒有多餘的操做。再舉個栗子:MongoDB就是放東西(數據)時把東西扔入相應的櫃子(數據庫)便可,而MySQL則要保持與送東西人的溝通(雙向鏈接保持),東西的摺疊整理分格存儲(事務+有模式)。MySQL的批量插入就是減小了溝通以及分格等過程,而MongoDB自己就不存在這些過程,所以MongoDB就不存在批量插入這個概念了。結論就是,MongoDB的普通插入比MySQL的批量插入還要快,或者說MongoDB的普通插入就是批量插入。spa
問題2:把多個操做放入一個事務裏一塊兒執行不就不能實現了?設計
這個問題更沒有技術含量了,MongoDB有事務麼?仍是那句,不要把NoSQL當關系型數據庫用。那豈不是MongoDB的數據完整性和數據安全性會不好?這個,還得再重複一遍,MongoDB的設計是爲了處理大規模數據的,因此對數據完整性要求不是那麼嚴格。若是非要較真兒的話,MongoDB也能夠處理這種狀況,就是getLastError,它會犧牲性能以獲取數據操做是否正確,你能夠在批量插入一批數據後調用一次這個方法,若是出錯,就把這批數據從新操做一遍,一批調用getLastError一次,既可保證性能,又可保證數據安全。orm
批量查詢xml
再來講一下批量查詢,這裏的批量對應於官網上的batch select的概念,能夠理解爲一次查詢一批數據。不少人在使用數據庫的時候會用:
Statement stmt = a.createStatement();
ResultSet rs = stmt.executeQuery(sql);
for(int i = 1; i < 10000; i++){
//read data from rs
}
這樣操做,會把數據庫中的數據所有讀入內存仍是每條數據都去數據庫中讀一次?實際上二者都不是,MySQL會把部分數據放入內存,若是這部分數據讀完了,那麼再讀入一部分。由於好久沒用MySQL了,我記得C++的驅動中確實有一個類是用於把所有數據都讀入內存的,不過這種方法不多人使用。
MongoDB的查詢是這樣的,你用Cursur去查詢,若是沒有設置batch size這個參數,那麼MongoDB默認會返回101條數據,等到這101條數據讀完了,也就是說用戶想讀第102條數據,那麼驅動會再次去MongoDB中獲取後面的一批數據,這批數據不是以個數記的,而是最大限制4M的大小,將這4M的數據返回供用戶繼續讀,讀完再申請4M。固然,你能夠經過batch size來改變這一數值,若是設置了,那麼每次返回都會返回batch size條數據。
轉載請註明出處:http://blog.sina.com.cn/s/blog_56545fd301013zav.html