用户
 找回密码
 入住 CI 中国社区
搜索
查看: 7662|回复: 15
收起左侧

[讨论/交流] 关于分页的效率问题

  [复制链接]
发表于 2010-4-2 19:25:42 | 显示全部楼层 |阅读模式
使用CI分页,发现总是要先得到$config['total_rows']这个参数。要得到这个参数需要查询一次数据库,并计数。在显示的时候,又要用LIMIT来查询一次,我觉得这样完全没有必要,很影响效率,不知道大家怎么看?
发表于 2010-4-2 22:30:51 | 显示全部楼层
因为要计算总页数,我自己写的分页也得query两次,不知道有高淫有一次query的方法吗?
发表于 2010-4-2 23:39:54 | 显示全部楼层
除非不计算总页数,或者缓存总数。。。。
 楼主| 发表于 2010-4-3 05:12:22 | 显示全部楼层
能不能一次查询得到总数,同时把结果也保存起来。显示的时候,根据页面显示结果里的一部分?
发表于 2010-4-3 09:39:34 | 显示全部楼层
我也是查询2次的,一次带LIMIT,得到当前页的结果,一次不带LIMIT并count,得到总数。不过不知为何计算总数的查询总是很慢,而且当检索条件比较复杂后,两次查询的时间加起来就很客观了…现在我打算用数据库缓存来减少计算总数的查询。
发表于 2010-4-3 10:38:15 | 显示全部楼层
本帖最后由 ywqbestever 于 2010-4-3 10:40 编辑

回复 4# baiyuxiong


    你说的当然是可以的,返回的结果保存在数组里,比如20条记录,下标0-19,一页5条,现在要第二页,那就是输出数组的5-9条即可
但是这样返回的是你所有的记录,数据多了,是不是有点。。。。能比一次select count和一次limit来的好吗?
发表于 2010-4-3 11:40:09 | 显示全部楼层
本帖最后由 scckfzx 于 2010-4-3 11:41 编辑

如果你是非常大型的应用的话,将总记录缓存起来,然后隔一段时间更新下总记录,或者不显示总记录
一般的平台这点资源消耗还是无所谓的
CI案例:长途汽车查询:http://qiche.yiqi2.com
天气预报查询:http://tq.yiqi2.com
 楼主| 发表于 2010-4-4 01:06:23 | 显示全部楼层
回复 6# ywqbestever


   第一次得到总数的时候,不也是要查出来全部的记录统计数量吗?
发表于 2010-4-8 07:45:49 | 显示全部楼层
哦 第一次查总数时,不会查总量 用limit
发表于 2010-11-29 11:17:43 | 显示全部楼层
如果用的是mysql有一个办法,就是在查询语句中加个 SQL_CALC_FOUND_ROWS 参数,
如:
1、select SQL_CALC_FOUND_ROWS * from table limit 0 , 15 取得查询的结果
2、select FOUND_ROWS() 获得总行数

SQL_CALC_FOUND_ROWS 会自动屏蔽limit,效率问题就不清楚了,有人说快,有人说慢!

本版积分规则