記一次mongo慢查詢排查記錄

背景

近期收到客戶反映,系統的認證日誌不能根據用戶查詢接口總是報錯具體報錯爲:com.mongodb.MongoSocketReadTimeoutException:Timeout while receiving message

分析排查

  1. 既然報錯信息爲mongo數據庫超時,逐步定位應該是查詢超時導致的。
  2. 於是連接生產數據庫看下查詢collection的總記錄數 db.xxx.find({}).count(); 查到竟然有3000萬條記錄。
  3. 接下來思考爲什麼這麼慢,mongo這麼厲害3000萬條應該沒問題,於是就想看下有沒有加索引
  4. 自己模擬客戶操作做了一次查詢,然後在mongo執行 db.currentOp()查詢當前操作,下圖可分析到,當前操作已查詢包括兩個條件,但是隻給一個條件加了索引,然後執行db.xxx.getIndexes();查看當前的索引,果然如此、
  5. 後來自己又做了一個驗證 db.xxx.find({property.useId:22222}).explain();下圖可看到該條件進行了全表的掃描。
  6. 優化加索引 db.xxx.createIndex({property.useId:hashed},{background:true} )注{background:true}後臺創建索引不影響線上的業務。創建較慢
  7. 創建成功之後,在次執行查詢,很快得到響應

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章