上線不久的一個項目,突然反映速度變得慢了很多。
測試插入資料:
> for (i = 1; i <= 100000; i++){ ...
... db.test_customer.insert({
... "_id" : i,
... "user_id" : i
(30個欄位)
})
測試插入結果如下:
> db.test_customer.find({},{_id:1,create_dt:1}).sort({_id:-1}).limit(2)
{ "_id" : 11176, "create_dt" : ISODate("2014-07-22T03:10:10.435Z") }
{ "_id" : 11175, "create_dt" : ISODate("2014-07-22T03:10:10.420Z") }
> db.test_customer.find({},{_id:1,create_dt:1}).sort({_id:1}).limit(2)
{ "_id" : 1, "create_dt" : ISODate("2014-07-22T03:01:23.935Z") }
{ "_id" : 2, "create_dt" : ISODate("2014-07-22T03:01:24.187Z") }
>
看到插入的時間差,1萬多條記錄。花了10分鐘了。
怎麼會這麼慢呢。
後使用 mongotop 查看,訪問集中在一個文檔的讀寫中。
在使用另一個mongod 進程測試插入資料,發現 同樣的代碼,插入資料是正常的。1萬資料也就幾秒。
使用此方法排除了伺服器硬體及伺服器配置的問題。
mongod -port [otherport] dbpath=/otherpath/otherdb
分析懷疑可能是資料庫檔案讀寫資料的瓶頸。
決定把訪問讀寫特別多的那個 文檔 【表】 分到另建立的一個資料庫中去。
完成後,再測試插入。
再看插入的資料:
> db.test_customer.find({},{create_dt:1}).sort({_id:1}).limit(2)
{ "_id" : 1, "create_dt" : ISODate("2014-07-22T10:06:51.502Z") }
{ "_id" : 2, "create_dt" : ISODate("2014-07-22T10:06:51.509Z") }
> db.test_customer.find({},{create_dt:1}).sort({_id:-1}).limit(2)
{ "_id" : 10000, "create_dt" : ISODate("2014-07-22T10:06:58.016Z") }
{ "_id" : 9999, "create_dt" : ISODate("2014-07-22T10:06:58.015Z") }
>
可以看到 只用了7秒,比以前好多了。
看來還是有檔案讀寫瓶頸。能分開的資料,還是分成多個資料庫最好。