仅缓存 FuelPHP ORM 结果中的关系数据
Posted
技术标签:
【中文标题】仅缓存 FuelPHP ORM 结果中的关系数据【英文标题】:Caching only a relation data from FuelPHP ORM result 【发布时间】:2014-09-12 16:41:10 【问题描述】:我正在使用 Fuelphp 和 mysql 开发应用程序,并且正在使用提供的 ORM 功能。问题出在下表:
表:pdm_data
海量表格(350 多列,多行) 表格数据相当静态(每天仅更新一次) 主键:obj_id表:change_request
只有几列 数据变化频繁(10-20次/分钟) 引用主键(来自表 pdm_data 的 obj_id)用户可以自定义对他们可见的数据表,例如。他们可以在列上保存过滤器(例如 change_request.obj_id=34 AND pdm_data.state = 6),然后将这些过滤器转换为使用 ORM 进行实时查询。
但是,使用 ORM 进行查询确实很慢,因为表 pdm_data 很大,甚至大约 100 行也会产生许多 mbs 的数据。最大的问题似乎在 FuelPHP ORM 中:即使查询本身是相对较快的模型水合等,也需要很多秒。理想的解决方案是缓存来自 pdm_data 表的结果,因为它是相当静态的。但是,据我所知,FuelPHP 不允许您通过关系缓存表(您可以缓存查询的完整结果,因此两个表或一个都没有)。
此外,使用带有连接而不是 ORM 的普通 SQL 查询不是理想的解决方案,因为我需要处理水合模型很棒的其他任务。
我目前有以下代码:
//Initialize the query and use eager-loading
$query = Model_Changerequest::query()->related('pdmdata');
foreach($filters as $filter)
//First parameter can point to either table
$query->where($filter[0], $filter[1], $filter[2]);
$result = $query->get();
...
有人对此有好的解决方案吗?
感谢阅读!
【问题讨论】:
【参考方案1】:版本 1 ORM 的缓慢是一个已知问题,正在 v2 中解决。我当前的基准测试显示 v1 orm 需要 2.5 秒(在我的机器上,ymmv)来水合 40k 行,而当前的 v2 alpha 需要大约 800 毫秒。
目前恐怕最简单的解决方案是取消大型选择的 ORM 并使用 DB
类构建查询。我知道您说过要保留 ORM 的抽象以简化开发,一种解决方案是使用 as_object('MyModel')
返回填充的模型对象。
另一方面,如果性能是您主要关心的问题,那么 ORM 根本不适合。
【讨论】:
以上是关于仅缓存 FuelPHP ORM 结果中的关系数据的主要内容,如果未能解决你的问题,请参考以下文章