设为首页 收藏本站
查看: 727|回复: 0

[经验分享] mongodb页面展示列表时遇到展示慢的问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-17 10:09:02 | 显示全部楼层 |阅读模式
      当我们开发程序的时候逃不开的就是写增删改查,当进行增删改操作的时候很多会遇到并发的问题,而当查询的时候如果数据量过大,那么查询就会很慢,查询很少的数据可能就会几秒甚至几十秒的时间,而很多人选择的方式就是加索引,同样的我们很多开发人员用到了mongodb存储类似日志之类的大数据,然后mongodb由于业务的增多和时间的积累,可能数量到达一定程度之后,查询也会变的很慢,加了索引之后也是如此,在通过调试之后发现了一个问题。        当我们查询的时候很多情况下最耗费时间的其实是count方法,很多人也换成了size方法,但是速度还是相差不远,所以能做的就是在分页展示的时候尽量少的去查询总数,不查询总数同样也是可以实现分页操作的,从而大大简化搜索时间。
QQ截图20161017100844.png
        基本思路是,页面的上一页和下一页把展示过的条数和要显示的条数都传过去,传到后台mongodb里面作为参数
1
DBCursor limit =this.getCollection().find(condition).skip(query.getPageIndex()).sort(basicDBObject).limit(query.getPageSize());



而点击下一页的时候是否到最后可以通过分页显示的条数和这个展示的条数来判断,同理,第一页的展示条数永远是0开始,比较特殊的情况是当最后一页的条数恰巧等于展示数量,那么直接展示最后一页或者暂无数据都是可以的,实现的代码展示如下:
1.分页工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package com.group.erp.common.util;
import java.util.ArrayList;
public  class PaginatedMongoArrayList<T> extends ArrayList<T> implements PaginatedMongoList<T>{
    private static final long serialVersionUID = 2841788433467303352L;
    public static final int PAGESIZE_DEFAULT = 20;
    private int pageSize;
    private int startRows;
    private int countItem;
    public PaginatedMongoArrayList() {
        //repaginate();
    }
    public PaginatedMongoArrayList(int startRows, int pageSize) {
        this.startRows = startRows;
        this.pageSize = pageSize;
        //repaginate();
    }
    public boolean isFirstPage() {
        return this.startRows <= 0;
    }
    public int getCountItem() {
        return countItem;
    }
    public void setCountItem(int countItem) {
        this.countItem = countItem;
    }
    public boolean isLastPage() {
        return this.pageSize > this.countItem;
    }
    public boolean isNextPageAvailable() {
        return !isLastPage();
    }
    public boolean isPreviousPageAvailable() {
        return !isFirstPage();
    }
    public int getNextPage() {
        if (isLastPage()) {
            return this.startRows;
        }
        return this.startRows + this.pageSize;
    }
    @Override
    public int getPreviousPage() {
        if (isFirstPage()) {
            return 0;
        }
        return this.startRows - this.pageSize;
    }
    public int getPageSize() {
        return this.pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
        //repaginate();
    }
    @Override
    public boolean isMiddlePage() {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public int getIndex() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void setIndex(int paramInt) {
        // TODO Auto-generated method stub

    }
    @Override
    public int getTotalItem() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void setTotalItem(int paramInt) {
        // TODO Auto-generated method stub

    }
    @Override
    public int getTotalPage() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public int getStartRow() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public int getEndRow() {
        // TODO Auto-generated method stub
        return 0;
    }

}
package com.group.erp.common.util;

import java.util.List;

public  interface PaginatedMongoList<T> extends List<T> {
    /**
     * @描述 : 是否是中间页
     *
     * @return
     */
    public  boolean isMiddlePage();

    /**
     * @描述 : 是否是末页
     *
     * @return
     */
    public  boolean isLastPage();

    /**
     * @描述 : 下一页是否可用
     *
     * @return
     */
    public  boolean isNextPageAvailable();

    /**
     * @描述 : 上一页是否可用
     *
     * @return
     */
    public  boolean isPreviousPageAvailable();

    /**
     * @描述 : 获取总页数
     *
     * @return
     */
    public  int getPageSize();

    public  void setPageSize(int paramInt);

    /**
     * @描述 : 获取当前页
     *
     * @return
     */
    public  int getIndex();

    public  void setIndex(int paramInt);

    /**
     * @描述 : 获取数据总条数
     *
     * @return
     */
    public  int getTotalItem();

    public  void setTotalItem(int paramInt);

    /**
     * @描述 : 获取总页数
     *
     * @return
     */
    public  int getTotalPage();

    /**
     * @描述 : 起始条数
     *
     * @return
     */
    public  int getStartRow();

    /**
     * @描述 : 结束条数
     *
     * @return
     */
    public  int getEndRow();

    /**
     * @描述 : 下一页
     *
     * @return
     */
    public  int getNextPage();

    /**
     * @描述 : 上一页
     *
     * @return
     */
    public  int getPreviousPage();

    /**
     * @描述 : 是否是第一页
     *
     * @return
     */
    public  boolean isFirstPage();
}



velocity的分页宏:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#macro (showPage $module $page)
    #if($page)
        <div class="span12"><div class="dataTables_info" id="DataTables_Table_0_info">共有 $!page.totalItem 条记录 $!page.index/$!{page.totalPage}页</div></div>
        <div class="span12 center">
        <div class="dataTables_paginate paging_bootstrap pagination">
        <ul>
             <li class="disabled"><a href="javascript:void(0);">每页显示</a></li>
             <li class="s-page">
                <select id="selSize" style="width:auto;height:33px;display:block;float:left;" onchange="goToSize('$module.addQueryData("kw","").render()','1',this.value)">
                    #foreach($i in [10,20,30,40,50])
                        #if($!{page.pageSize}==$i)
                            <option value="$!i" selected="selected">$!i</option>
                        #else
                            <option value="$!i" >$!i</option>
                        #end
                    #end
                </select>
             </li>
             <li class="disabled"><a href="javascript:void(0);">行</a></li>
        #set($pagePos = 2) ##当前页的尾巴长度
        #if($page.previousPageAvailable) ##如果能向上翻页
        <li><a href="javascript:goToSize('$module.render()','$!{page.previousPage}',$!{page.pageSize})">上一页<b></b></a></li>
        <li><a href="javascript:goToSize('$module.render()','1',$!{page.pageSize})">首页</a></li>
        #else
           <li class="disabled"><a href="#">上一页<b></b></a></li>
           <li class="disabled"><a href="#">首页</a></li>
        #end
        #foreach($i in [$pagePos..1]) ##增加前面的尾巴
        #if($!page.index - $i > 0)
            #set($pageIndex= $!page.index - $i)
            <li><a href="javascript:goToSize('$module.render()',$!{pageIndex},$!{page.pageSize})">$pageIndex</a></li>
        #end
        #end
        <li class="active"><a>$!page.index</a></li>
        ##显示当前页号
        #foreach($i in [1..$pagePos]) ##增加后面的尾巴
        #if($!page.totalPage - $!page.index - $i >= 0)
            #set($pageIndex= $!page.index + $!i)
           <li><a href="javascript:goToSize('$module.render()',$!{pageIndex},$!{page.pageSize})">$pageIndex</a></li>
        #end
        #end
        #if($page.nextPageAvailable) ##显示后面的页
        <li><a href="javascript:goToSize('$module.render()','$!{page.totalPage}','$!{page.pageSize}')">末页</a></li>
        <li><a href="javascript:goToSize('$module.render()','$!{page.nextPage}',$!{page.pageSize})">下一页<b></b></a></li>
        #else
            <li class="disabled"><a href="#">末页</a></li>
            <li class="disabled"><a href="#">下一页<b></b></a></li>
        #end
         <li class="s-page">跳转到</li>
         <li class="s-page">
            <select id="selPage" style="width:auto;height:33px;display:block;float:left;" onchange="goToPage('$module.render()',this.value,$!{page.pageSize})">
            #foreach($i in [1..$!page.totalPage])
                #if($!page.index == $!i)
                <option value="$!i" selected ="selected">$!i</option>
                #else
                <option value="$!i">$!i</option>
                #end
            #end
            </select>
         </li>
        </ul>
        </div>
        </div>
        $!module.reset()
    #end
#end
#macro (showAjaxPage $module $page)
    #if($page)
        <div class="pull-left"><div class="dataTables_info" id="datatable2_info">共有 $!page.totalItem 条记录 $!page.index/$!{page.totalPage}页</div></div>   

        <div class="pull-right">
        <div class="dataTables_paginate paging_bs_full">
        <ul class="pagination">
             <li class="disabled"><a href="javascript:void(0);">每页显示</a></li>
             <li >
                <select id="selSize" style="width:auto;height:33px;display:block;float:left;" onchange="goSize('$module.addQueryData("kw","").render()','1',this.value)">
                    #foreach($i in [10,20,30,40,50])
                        #if($!{page.pageSize}==$i)
                            <option value="$!i" selected="selected">$!i</option>
                        #else
                            <option value="$!i" >$!i</option>
                        #end
                    #end
                </select>

             </li>
             <li class="disabled"><a href="javascript:void(0);">行</a></li>
        #set($pagePos = 2) ##当前页的尾巴长度
        #if($page.previousPageAvailable) ##如果能向上翻页
        <li><a href="javascript:void(0);" onclick="goSize('$module.render()','$!{page.previousPage}',$!{page.pageSize})">上一页<b></b></a></li>
        <li><a href="javascript:void(0);" onclick="goSize('$module.render()','1',$!{page.pageSize})">首页</a></li>
        #else
           <li class="disabled"><a href="javascript:void(0);">上一页<b></b></a></li>
           <li class="disabled"><a href="javascript:void(0);">首页</a></li>
        #end
        #foreach($i in [$pagePos..1]) ##增加前面的尾巴
        #if($!page.index - $i > 0)
            #set($pageIndex= $!page.index - $i)
            <li><a href="javascript:void(0);" onclick="goSize('$module.render()',$!{pageIndex},$!{page.pageSize})">$pageIndex</a></li>
        #end
        #end
        <li class="active"><a >$!page.index</a></li>
        ##显示当前页号
        #foreach($i in [1..$pagePos]) ##增加后面的尾巴
        #if($!page.totalPage - $!page.index - $i >= 0)
            #set($pageIndex= $!page.index + $!i)
           <li><a href="javascript:void(0);" onclick="goSize('$module.render()',$!{pageIndex},$!{page.pageSize})">$pageIndex</a></li>
        #end
        #end
        #if($page.nextPageAvailable) ##显示后面的页
        <li><a href="javascript:void(0);" onclick="goSize('$module.render()','$!{page.totalPage}','$!{page.pageSize}')">末页</a></li>
        <li><a href="javascript:void(0);" onclick="goSize('$module.render()','$!{page.nextPage}',$!{page.pageSize})">下一页<b></b></a></li>
        #else
            <li class="disabled"><a href="javascript:void(0);">末页</a></li>
            <li class="disabled"><a href="javascript:void(0);">下一页<b></b></a></li>
        #end
         <li class="disabled"><a href="javascript:void(0);">跳转到</a></li>
         <li >
            <input id="selPage" type="text" style="width:34px;height:33px;"  value="$!{page.index}" onblur="goPage('$module.render()',this.value,$!{page.pageSize},$!page.totalPage)"/>页
         </li>
        </ul>
        </div>
        </div>
        </div>
        $!module.reset()
    #end
#end
#macro (showAjaxMongoPage $module $page)
    #if($page)
        <div class="pull-right">
        <div class="dataTables_paginate paging_bs_full">
        <ul class="pagination">
             <li class="disabled"><a href="javascript:void(0);">每页显示</a></li>
             <li >
                <select id="selSize" style="width:auto;height:33px;display:block;float:left;" onchange="goSize('$module.addQueryData("kw","").render()','0',this.value)">
                    #foreach($i in [10,20,30,40,50])
                        #if($!{page.pageSize}==$i)
                            <option value="$!i" selected="selected">$!i</option>
                        #else
                            <option value="$!i" >$!i</option>
                        #end
                    #end
                </select>

             </li>
             <li class="disabled"><a href="javascript:void(0);">行</a></li>
        #set($pagePos = 2) ##当前页的尾巴长度
        #if($page.previousPageAvailable) ##如果能向上翻页
        <li><a href="javascript:void(0);" onclick="goSize('$module.render()','$!{page.previousPage}',$!{page.pageSize})">上一页<b></b></a></li>
        #else
           <li class="disabled"><a href="javascript:void(0);">上一页<b></b></a></li>
        #end
        #if($page.nextPageAvailable) ##显示后面的页
        <li><a href="javascript:void(0);" onclick="goSize('$module.render()','$!{page.nextPage}',$!{page.pageSize})">下一页<b></b></a></li>
        #else
            <li class="disabled"><a href="javascript:void(0);">下一页<b></b></a></li>
        #end
        </ul>
        </div>
        </div>
        </div>
        $!module.reset()
    #end
#end



service层:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
    public Result getCoreLogList(CoreLogQuery query) {
        Result result=new Result();
        // int count=    coreLogManager.queryCoreLogCount(query);
        // if(count>0){
        PaginatedMongoArrayList<CoreLog> pageList = new PaginatedMongoArrayList<CoreLog>(
                        query.getPageIndex(), query.getPageSize());

        List<CoreLog> coreLogList= coreLogManager.queryCoreLog(query);

                pageList.setCountItem(coreLogList.size());
                query.setStartRow(query.getPageIndex());
                pageList.addAll(coreLogList);
                result.addModel("pageList", pageList);
                result.addModel("msg", "success");
        // }
        return result;
    }




欢迎提出宝贵意见


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287343-1-1.html 上篇帖子: MongoDB根据时间aggregate示例 下篇帖子: mongo 自动创建索引导致应用连接超时
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表