锁定老帖子 主题:发疯Hibernate分页问题,性能优化!
精华帖 (2) :: 良好帖 (0) :: 新手帖 (18) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-26
nihongye 写道 myprincejava 写道 nihongye 写道 很简单,大数据量,不要计算总数
你问题没看明白?现在就是要分页..怎么可能不得到count... 一个只足够翻页的方法,获取多于显示记录数量一的记录集,以此判断是否存在下一页。 计算总数耗费数据库资源,匹配的结果数量一多,建立的索引都浪费了。 这样就等于只能上一页和下一页了, 总页数不知道。如果确实页面只需要有上一页和下一页,倒也是不错的方案,避免了求总记录数。 |
|
返回顶楼 | |
发表时间:2008-07-26
icewubin 写道 nihongye 写道 myprincejava 写道 nihongye 写道 很简单,大数据量,不要计算总数
你问题没看明白?现在就是要分页..怎么可能不得到count... 一个只足够翻页的方法,获取多于显示记录数量一的记录集,以此判断是否存在下一页。 计算总数耗费数据库资源,匹配的结果数量一多,建立的索引都浪费了。 总数可以缓存啊,刚才说了5秒缓存性能足够好了。 如果真的是很严重的性能问题,需求就不对,我只是说一个通用的情况,很严重的性能问题往往是需求的问题,而不是技术问题。用户自己真的需要每次翻页都实时的知道当前记录的精确总数么?然后一页一页去翻(1000多页?),这个UI交互模式的需求分析就是有问题的。 开拓思路,例如我如果用LiveGrid(Ext的一个扩展实现,操作方式类似于GoogleReader),总数只会取一次,相当于缓存了总数,你当然可以说这个总数实时性不高,当然没有完美的方案,都是有点缺陷的,要看这些缺陷是否值得去做,当前例子就是“实时性”真的那么重要么?0秒延时和5秒延时区别真的那么大么?很多情况下,1小时延时都被人吹成实时呢。 很多体育比赛实况转播不仅技术上有几秒的延时(卫星传送距离太远需要时间),更多的是故意的5分钟延时,这还不是中国特色,国外也很多的。 记录多的话,确实可以考虑这样, 牺牲一点实时性而已, 对海量数据而言倒能接受。 |
|
返回顶楼 | |
发表时间:2008-07-26
好多回复都跑题了,楼主的问题不是分页,而是如何查询一个海量数据表的总数,Lucas Lee已经给出了很好的答案。
|
|
返回顶楼 | |
发表时间:2008-07-26
1、如果你不用考虑查询条件得到总记录数,用一个触发器,在一个单独的表中记录总记录数。
2、如果总记录数是根据不同的条件得到值不一样,单独整个查询缓存搞定。 3、其它,可能唯有select count(*)。 |
|
返回顶楼 | |
发表时间:2008-07-26
count(id) 会好一点点
|
|
返回顶楼 | |
发表时间:2008-07-27
tangbo530 写道 count(id) 会好一点点
有时候你的一句hql(sql)不包含id的。 |
|
返回顶楼 | |
发表时间:2008-07-27
lsy 写道 好多回复都跑题了,楼主的问题不是分页,而是如何查询一个海量数据表的总数,Lucas Lee已经给出了很好的答案。
那样的回答是不错,可以把那那种方案的海量级别进一步提高,但是各种“海量”都是有各自极限的,我的意思是思路可以拓展嘛。 再说了,那个方案只是测试了MySql啊,楼主没说什么数据库啊。我前面也提到,SqlServer2000的分页查询就很烂(不是计算总数烂),很多数据库行为不一样的。跑题有时候也没啥不好,只要别跑得太远。 尽管我说了这么多“废话”,Lucas Lee的回复的含金量还是非常非常高的。 |
|
返回顶楼 | |
发表时间:2008-07-28
icewubin 写道 tangbo530 写道 count(id) 会好一点点
有时候你的一句hql(sql)不包含id的。 查询数据库部分结果时应尽量使用索引字段,这样确实能提高性能. |
|
返回顶楼 | |
发表时间:2008-07-28
移除 order by 语句时用的代码是
Pattern pattern = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*" , Pattern.CASE_INSENSITIVE); 如果是子查询里有 order by 语句,岂不是会从子查询的 order by 开始全部截掉,包括主查询的条件。 |
|
返回顶楼 | |
发表时间:2008-07-28
建议用一个字段来存储count数,当有增加一条记录时count数+1,删除对应的一条记录时,count -1,查询分页的取count数时候直接去取一个字段记录就可以了.
|
|
返回顶楼 | |