仅缓存来​​自FuelPHP ORM结果的关系数据

时间:2014-09-12 16:41:10

标签: php mysql caching orm fuelphp

我正在使用FuelPHP& amp; 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 个答案:

答案 0 :(得分:1)

版本1 ORM的缓慢是一个已知的问题,正在用v2解决。我目前的基准测试显示v1 orm需要2.5秒(在我的机器上,ymmv)来补充40k行,而当前的v2 alpha需要大约800ms。

现在我担心最简单的解决方案是取消大型选择的ORM并使用DB类构建查询。我知道您说要保留ORM的抽象以简化开发,一种解决方案是使用as_object('MyModel')来返回填充的模型对象。

另一方面,如果性能是您的主要考虑因素,则ORM根本不适合。