paginate函数重载的问题

请教一下,由于业务需要必须要改写Paginate分页函数,但是里面的dialect等好几个私有变量和函数,没法使用,有没有办法。

实在不行只能完全自己写了。

(改写Paginate的原因是数据超过5w条后,limit xxxxx,xx的速度超级慢,即使加了索引页不起作用,解决方法就是分步select,所以只好重写这个函数)

评论区

JFinal

2018-06-05 09:36

paginate 操作与数据库有关,需要在业务层中调用,那么你可以在业务层中利用 Db 中的各种方法来实现 paginate ,自己手动拼接 sql 就可以了

此外, 5W 条数据的分页根本不是个事,肯定是 sql 造成了多次全表扫描才会很慢, 2011 年的时候我做的一个项目,几千万条数据分页一点也不慢

rirai

2018-06-05 10:09

谢谢!直接调用paginate后,当取3000多页的时候,花费了135秒,我用explain看了一下,发现是用filesort方式的,完全没有用到索引,所以就用分步的sql语句,结果就1秒以内搞定了。
谢谢大神,我用Db中的各种方法实现就可以了。

rirai

2018-06-05 11:41

我的sql语句如下:
select id from posts p where post_type!=4 and status!=1 order by createAt desc limit 28416, 12;
如果直接查询,需要140秒时间。
我先查出 id,
然后再用id查询,花时间<1秒。
但是即便这样还是用到了filesort,略有点慢。
有没有更好的方法呢?

rirai

2018-06-05 11:42

@JFinal 请教一下,谢谢。

JFinal

2018-06-05 11:57

@rirai 使用控制台登录 mysql,然后用下面的方法:
explain 原sql在此

看一看你的 sql 是不是使用了索引,这个是性能提升的关键

JFinal

2018-06-05 11:58

@rirai 具体到你的 sql ,你应该创建 post_type 与 status 这两个字段的联合索引

rirai

2018-06-05 19:35

@JFinal 谢谢了,我就是用explain 来检查的。加了联合索引。再次感谢。

JFinal

2018-06-05 21:18

@rirai mysql 的索引设计是比较差的,有时候你明明建立了索引,mysql 就是不使用

mysql 对索引的使用有很多限制,例如 where 中字段的多少,甚至字段的次序

热门反馈

扫码入社