2014-09-12 68 views
1

我正在使用FuelPHP & mySql開發應用程序,我正在使用提供的ORM功能。問題是與下表:只緩存來自FuelPHP的關係數據ORM結果

表:pdm_data

  • 海量表(350+列,多行)
  • 表數據是相當靜態的(更新每天只有一次)
  • 主鍵:obj_id

表:change_request

  • 只有幾列
  • 數據經常變化(10-20次/分)
  • 引用主鍵(obj_id從表pdm_data)

用戶可以自定義數據表是他們可見,例如。他們可以在列上保存過濾器(例如change_request.obj_id = 34 AND pdm_data.state = 6),然後將其轉換爲ORM實時查詢。

但是,使用ORM進行查詢確實很慢,因爲表pdm_data很大,甚至大約100行將導致多個mbs的數據。最大的問題似乎是在FuelPHP ORM中:即使查詢本身相對較快,模型水合等也需要很多秒。理想的解決方案是緩存來自pdm_data表的結果,因爲它相當靜態。不過,據我所知,FuelPHP不允許你通過關係來緩存表(你可以緩存查詢的完整結果,因此可以緩存這兩個表或沒有)。

此外,使用正常的SQL查詢加入而不是ORM並不是理想的解決方案,因爲我需要處理水合模型非常棒的其他任務。

我現在有下面的代碼:

//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根本就不適合。