锁定老帖子 主题:关于分页查询的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-25
absolute虽然这个方法每个jdbc驱动都有,但是实现的具体方法和效率是不一样的。
count的影响确实不大。重建索引就可以。200万的一个表中,没建索引之前,count需要20多秒,建了索引,0.n秒就可以了。 不过如果真是百八十万条以上的分页,还是先让用户输入查询条件更为合适。或者默认限定查询条件。 |
|
返回顶楼 | |
发表时间:2006-10-25
Lucas Lee 写道 你的疑问很好。
BTW,我不使用缓存的原因,并不仅是因为性能的考虑,而主要是: 1)你将几万甚至几十万的记录缓存在session里,(应该是放在这里吧?),你不觉得session里放大量东西会严重影响性能么?这个应该算是常识吧。 2),你什么时候更新缓存?用户想看到自己或其他用户添加、更改的内容,你用什么逻辑去更新?是否要考虑线程安全性?深入点,你会发现实际所有使用缓存的方法都会有类似的问题,所以特别是在数据库应用中,我会对数据内容缓存(非配置数据)持非常谨慎的态度。 而对于性能来说,我的一个主要观点是: (我的假设,对一般情况而言)如果用户发现数据非常大,在一般情况下,不会依次查看每页记录,而会更改查询条件或排序方式,使结果更容易读。如果我的假设成立,那么显然,将所有记录都load到缓存里的方法,将有大部分的内容是不会用到的。所以,以前有些数据库查询的设计是,超过一千条的记录,只显示前一千条,和总记录数,这种设计,不是没有道理的,但显然数据库分页的方式比这种更好些,而且保持了类似的性能。 除了session里面不放大量东西这个常识以外 还应该有一个常识:缓存一切可以缓存的资源。 |
|
返回顶楼 | |
发表时间:2006-10-25
引用 除了session里面不放大量东西这个常识以外
从来也不会把数据忘session中缓存的,缓存方案很多,这个最烂。 引用 count的影响确实不大。重建索引就可以。200万的一个表中,没建索引之前,count需要20多秒,建了索引,0.n秒就可以了。
关键问题就在这里,你不能保证每个查询都走索引,尤其是你不能保证每个人都能做到这样。不走索引,任何查询都慢。 还有你说分页没有什么值得讨论的,我也不同意。任何好的思路都有使用范围,我就是希望能够证实我所总结的这个范围是正确的。 |
|
返回顶楼 | |
发表时间:2006-10-25
人身攻击的不要.....
分页有传统方式 传统方式有以下好处: 1好用 2稳定 3教的快 4对于海量数据(我见过10W数据的程序)可达到目的 新的想法有什么好处还不很清楚 但没人尝试怎么才会进步呢? |
|
返回顶楼 | |
发表时间:2006-10-25
刚特意插了102w记录(mssql)
翻页到1000000记录时候的分页存储过程执行时间 29XX ms count 102w记录的 是15XX ms 字段就三个 id,name,pass count和分页条件都是空,排序空. id主键.name索引. |
|
返回顶楼 | |
发表时间:2006-10-26
如果用户输入一个查询条件得到10万条数据,你不分页难道等死啊
我们来看看结果。 分页,只返回10条记录,用户感觉很爽,这么快就得到答案了。 不分页,返回10万条记录,用户可以重启系统了。。。 |
|
返回顶楼 | |
发表时间:2006-10-26
cats_tiger 写道 引用 除了session里面不放大量东西这个常识以外
从来也不会把数据忘session中缓存的,缓存方案很多,这个最烂。 引用 count的影响确实不大。重建索引就可以。200万的一个表中,没建索引之前,count需要20多秒,建了索引,0.n秒就可以了。
关键问题就在这里,你不能保证每个查询都走索引,尤其是你不能保证每个人都能做到这样。不走索引,任何查询都慢。 还有你说分页没有什么值得讨论的,我也不同意。任何好的思路都有使用范围,我就是希望能够证实我所总结的这个范围是正确的。 正因为不是每个人查询都能够做到充分利用索引,所以分页查询里就涉及到对数据的分析和掌握。 那么,数据库不直接提供分页功能也就比较合理了。 因为,提供了分页,却不能保证性能。 要性能就要用户自行调优,这就是用户应用层面的东西了。 |
|
返回顶楼 | |
发表时间:2006-10-27
|
|
返回顶楼 | |
发表时间:2006-10-27
对记录缓存存在疑问,这样的策略好像不太适合实际情况。用户数据更改后一直看不到变化。
现在存在的另一个问题是如果用户修改记录后分页的页数变了,如何定位当前页呢。 |
|
返回顶楼 | |