亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

mongodb分頁優化

系統 1988 0

現在參與一個項目的開發,需要用java查詢mongodb數據庫,在這里分頁用的skip sort 和limit結合,查詢語句如下(已經在相關字段建立索引)

?

    DBCursor cursor = collection.find(query).skip((skip - 1) * PAGESIZE).sort(new BasicDBObject("starttime", -1)).limit(PAGESIZE);//PAGESIZE=10
  


由于分頁,這里需獲取符合條件的總數 語句如下

?

int count = cursor.count()

根據count和PAGESIZE的兩個數據來分頁。由于帶條件的count()方法執行起來特別耗時,我用二百萬的數據測試了一下,cursor.count()就耗時6.5s多,mongodb權威指南這不書也指出count()方法隨著查詢條件越多,執行速度越慢。

現在問題出來了,現在模擬一下操作

1)點擊查詢執行查詢方法queryLists()(這是我代碼中的方法名)并執行耗時的count()方法獲取符合條件的數量,進行分頁

2)點擊下一頁或者點擊某一頁時,同樣執行queryLists()方法,同樣也需要執行該方法體中的count()方法,這樣count方法又耗去一部分時間

顯然用戶體驗不是很好,每次點擊查詢時就很耗時了,點擊下一頁或者某一頁時同樣還得等待,這樣的話誰都受不了


下面是我的優化方案

1)設置一個變量clickQuery,當用戶點擊查詢按鈕時 clickQuer賦值為0.當點擊下一頁或者上一頁或者跳轉頁面時clickQuery=1.

???? 也就是說用clickQuery來判斷用戶是否點擊查詢按鈕

2)既然點擊查詢時已經獲取了count,何必再點擊下一頁時在執行cursor.count()方法呢?所以我的做法就是把點擊查詢的時候獲取的count保存起來

??? 當用戶點擊下一頁的時候,直接讀取已經保存的count,而不是執行耗時的cursor.count()方法


方法優點:

????? 點擊下一頁或者某一頁或者跳轉頁面時,由于已經保存過查詢時的count,所以速度很快

方法缺點:

??? 用戶點擊查詢按鈕時,因為要執行cursor.count方法,所以還是很慢。


代碼實現如下

?

    int count = 0;

if (click.equals("0")) {// 如果點擊查詢

    count = cursor.count();//獲取符合條件的數量

    // 序列化,保存count2

   Seria.serializable(new BtnClick(count), Seria.ACTIVITY_COUNT_FILE);

   System.out.println("點擊查詢");//Seria是我自己定義的一個類,來序列化數據

} else {// 如果點擊下一頁或者跳轉頁

  // 讀取序列化信息

  BtnClick btnClick = Seria.reverseSer(Seria.ACTIVITY_COUNT_FILE);

  count= btnClick.getCount();

   System.out.println("點擊下一頁");

}

///分頁處理略


  


?

    	/**

	 * 序列化

	 */

	public static void serializable(BtnClick btnClick,String file) {

		try {

			

			File serFile = new File(file);

			// 判斷序列化文件是否存在, 不存在則創建

			if (!serFile.exists())

				serFile.createNewFile();

			//打開serFile的輸出流

			FileOutputStream fos = new FileOutputStream(serFile);

			ObjectOutputStream oos = new ObjectOutputStream(fos);

			// 將上下文對象寫到序列化文件中

			oos.writeObject(btnClick);

			oos.close();

			fos.close();

		} catch (Exception e) {

			e.printStackTrace();

		}

	}

	

	/**

	 * 反序列化

	 */

	public static BtnClick reverseSer(String file) {

		File serFile = new File(file);

		BtnClick btnClick = null;

		if (!serFile.exists())

			return null;

		try {

			// 得到文件輸入流

			FileInputStream fis = new FileInputStream(serFile);

			ObjectInputStream ois = new ObjectInputStream(fis);

			// 設置ContextHolder的DownloadContext

		    btnClick = (BtnClick) ois.readObject();

			ois.close();

			fis.close();

		} catch (Exception e) {

			e.printStackTrace();

		}

	

		return btnClick;

	}
  


?

我的問題:因為用skip方法查詢大量數據的時候速度慢,不知道有什么方法可以優化一下,mongodb權威指南的那個方法,只適合一頁一頁的調整而不適合跨頁跳轉,所以大家如果有好的查詢方案,可以和小弟在此說一下,謝謝。

?

同樣以上方法如有不當之處,歡迎批評指正

?

?

mongodb分頁優化


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国内精品伊人久久久影视 | 国产成人乱码一区二区三区 | 两性视频网站 | 久久九九99热这里只有精品 | 精品国产hd | 久久精品道一区二区三区 | 热久久99影院 | 99热久久这里只有精品9 | 免费一级特黄 欧美大片 | 97影院理论片手机在线观看 | 日韩久久久精品中文字幕 | 久热国产精品视频 | 91久久天天躁狠狠躁夜夜 | 中文字幕在线看 | 亚洲久久在线 | 亚洲欧洲一区二区三区在线观看 | 久热爱免费精品视频在线播放 | 国产一区二区在线看 | 国产精品亚洲综合一区在线观看 | 日韩欧美高清在线 | 97视频精品全国在线观看 | 国产成人禁片在线观看 | 亚洲一区中文字幕在线观看 | 成人午夜私人影院入口 | 四虎影视库国产精品一区 | 色综合九九 | 日日免费视频 | 欧美精品日韩一区二区三区 | 日本人一级毛片视频 | 狠狠澡夜夜澡人人爽 | 日韩每日更新 | 日本一级淫片a免费播放 | 在线播放波多野结衣 | 日韩免费一级毛片 | 欧美性理论片在线观看片免费 | 五月天婷婷久久 | 国产成人免费视频精品一区二区 | 青青青在线视频人视频在线 | 日韩一级欧美一级一级国产 | jizz成熟丰满中国妇女 | 日韩欧美中文字幕出 |