在MongoDB中使用了一個聯合索引,發現了一些問題,記錄一下,方便以後查閱!
首先來看錶的說明:
注意高亮出的索引:
prop.lis_sta_1_prop.is_recom_-1_prop.re_t_-1_prop.post_t_-1,這4個字段分別是
帖子狀態、推薦狀態,推薦時間,發貼時間
測試了一下,有以下結果
可以使用上面索引的查詢:
db.post.find({'prop.lis_sta'{$in[5]}}).sort({'prop.is_recom':-1,'prop.re_t':-1,'prop.post_t':-1}).explain(); db.post.find({'prop.lis_sta':5}).sort({'prop.is_recom':-1,'prop.re_t':-1,'prop.post_t':-1}).explain(); db.post.find({'prop.lis_sta'{$in[0,5]}}).sort({'prop.is_recom':-1,'prop.re_t':-1,'prop.post_t':-1}).limit(20).explain();
不可以使用上面索引的查詢:
db.post.find({'prop.lis_sta'{$in[0,5]}}).sort({'prop.is_recom':-1,'prop.re_t':-1,'prop.post_t':-1}).explain();
所以在這裏說明幾點:
1)、儘量避免以靈活的參數的形式傳遞排序規則,如果數據比較多的話,卻沒有建立相關索引,容易產生問題。
2)、修改了排序規則,要檢查索引,通過explain來測試一下。
3)、使用已有索引過濾掉儘量多的數據再排序,同時盡力保留limit限制,這個很重要。