论坛首页 Java企业应用论坛

发疯Hibernate分页问题,性能优化!

浏览 39933 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (18) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-26  
nihongye 写道
myprincejava 写道
nihongye 写道
很简单,大数据量,不要计算总数

你问题没看明白?现在就是要分页..怎么可能不得到count...

一个只足够翻页的方法,获取多于显示记录数量一的记录集,以此判断是否存在下一页。
计算总数耗费数据库资源,匹配的结果数量一多,建立的索引都浪费了。

这样就等于只能上一页和下一页了, 总页数不知道。如果确实页面只需要有上一页和下一页,倒也是不错的方案,避免了求总记录数。

0 请登录后投票
   发表时间:2008-07-26  
icewubin 写道
nihongye 写道
myprincejava 写道
nihongye 写道
很简单,大数据量,不要计算总数

你问题没看明白?现在就是要分页..怎么可能不得到count...

一个只足够翻页的方法,获取多于显示记录数量一的记录集,以此判断是否存在下一页。
计算总数耗费数据库资源,匹配的结果数量一多,建立的索引都浪费了。



总数可以缓存啊,刚才说了5秒缓存性能足够好了。

如果真的是很严重的性能问题,需求就不对,我只是说一个通用的情况,很严重的性能问题往往是需求的问题,而不是技术问题。用户自己真的需要每次翻页都实时的知道当前记录的精确总数么?然后一页一页去翻(1000多页?),这个UI交互模式的需求分析就是有问题的。

开拓思路,例如我如果用LiveGrid(Ext的一个扩展实现,操作方式类似于GoogleReader),总数只会取一次,相当于缓存了总数,你当然可以说这个总数实时性不高,当然没有完美的方案,都是有点缺陷的,要看这些缺陷是否值得去做,当前例子就是“实时性”真的那么重要么?0秒延时和5秒延时区别真的那么大么?很多情况下,1小时延时都被人吹成实时呢。

很多体育比赛实况转播不仅技术上有几秒的延时(卫星传送距离太远需要时间),更多的是故意的5分钟延时,这还不是中国特色,国外也很多的。

记录多的话,确实可以考虑这样, 牺牲一点实时性而已, 对海量数据而言倒能接受。
0 请登录后投票
   发表时间:2008-07-26  
好多回复都跑题了,楼主的问题不是分页,而是如何查询一个海量数据表的总数,Lucas Lee已经给出了很好的答案。
0 请登录后投票
   发表时间:2008-07-26  
1、如果你不用考虑查询条件得到总记录数,用一个触发器,在一个单独的表中记录总记录数。
2、如果总记录数是根据不同的条件得到值不一样,单独整个查询缓存搞定。
3、其它,可能唯有select count(*)。
0 请登录后投票
   发表时间:2008-07-26  
count(id) 会好一点点
0 请登录后投票
   发表时间:2008-07-27  
tangbo530 写道
count(id) 会好一点点


有时候你的一句hql(sql)不包含id的。
0 请登录后投票
   发表时间:2008-07-27  
lsy 写道
好多回复都跑题了,楼主的问题不是分页,而是如何查询一个海量数据表的总数,Lucas Lee已经给出了很好的答案。


那样的回答是不错,可以把那那种方案的海量级别进一步提高,但是各种“海量”都是有各自极限的,我的意思是思路可以拓展嘛。

再说了,那个方案只是测试了MySql啊,楼主没说什么数据库啊。我前面也提到,SqlServer2000的分页查询就很烂(不是计算总数烂),很多数据库行为不一样的。跑题有时候也没啥不好,只要别跑得太远。

尽管我说了这么多“废话”,Lucas Lee的回复的含金量还是非常非常高的。
0 请登录后投票
   发表时间:2008-07-28  
icewubin 写道
tangbo530 写道
count(id) 会好一点点


有时候你的一句hql(sql)不包含id的。

查询数据库部分结果时应尽量使用索引字段,这样确实能提高性能.
0 请登录后投票
   发表时间:2008-07-28  
移除 order by 语句时用的代码是
Pattern pattern = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*" 
        , Pattern.CASE_INSENSITIVE);

如果是子查询里有 order by 语句,岂不是会从子查询的 order by 开始全部截掉,包括主查询的条件。
0 请登录后投票
   发表时间:2008-07-28  
建议用一个字段来存储count数,当有增加一条记录时count数+1,删除对应的一条记录时,count -1,查询分页的取count数时候直接去取一个字段记录就可以了.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics