里面 fetchData 返回数据的时候是用 return array_slice($this->rawData, $pagination->getOffset(), $pagination->getLimit());
而CPagination中没有 setOffset 的方法,就是说这个rawData必须是取所有符合条件的数据。
数据库中有上千万条的数据,为了考虑效率使用的是 DAO 方式查询,这样就要取这么多数据送给CArrayDatapRrovider?
你们有没有什么好的方法?一定要扩展CArrayDataProvider 或 CPagination 吗?
netyum
(Netyum)
2
用CSqlArrayDataProvider也不错,DAO与AR效果差不多呢,只要你的索引优化好,
还有另一个方法就是让把你的sql写成视图,然后创建这个视图的model,当然这个model只能读不能写的,这样也不错!而且不用扩展任何widget。
hiscaler
(Hiscaler)
4
CArrayDataProvider 确实是取所有记录,这个是不是性能有点问题?
一次取出几万条数据就会很慢了,影响性能,这个东西应该重写
toplfx007
(Lifeixiang)
7
这个问题。应该是关于分页的问题。。。yii的分页。。就是在每次都获取一次所有数据。。然后再截取相应的数据。返回
无论是CSqlDataProvider还是用ar。。
你可以把分页的数据进行缓存。然后每次就不用请求数据库了。。这是个折中的办法。。但是不能解决根本问题。。除非重写yii的分页和dataprovider