2014-10-21 2 views
0

필자는 데이터베이스에 4 백만 행을 가지고 있는데, 필자는 시간에 걸러 내야한다.개체에 Laravel 절?

현재 내 쿼리를 캐시하기 위해 remember 함수를 사용하고 있습니다. 하지만 내 사용자에게 허용되는 몇 가지 정확한 쿼리가 있습니다. 어떻게 내가이 의미하는 것은 : 작년의

  • 모든 데이터를 6 개월
  • 모든 데이터는 지난 달의
  • 모든 데이터 지난 주
  • 모든 데이터를

캐시에 4 개의 쿼리가 있다는 것은 다음과 같습니다. 캐시없이 쿼리를 실행하면 약 30 초가 걸립니다.

내가 원하는 것은 모든 데이터를받은 후 해당 데이터를 필터링하는 것입니다. 한 번을 캐싱합니다.

나는을 사용하여 원하는 방식으로 필터링하려면 모든 데이터를 사용할 수 있습니다.

A는 몇 가지 코드를 더 명확하게 비트 : 어디 기능

<?php 

if (Cache::has('alldata')) { 
    $alldata = Cache::get('alldata'); 
} else { 
    $alldata = Data::all(); 
} 

// Filters 
$alldata->where('activity', '=', 1)->get(); 

// The code i currently use for every filter 
$lastYearData = Data::where('column', '=', 'filter')->get(); 
// The line above "4 times" for each filter 

?> 
+4

아마도 캐시에 수백만 개의 행을 저장하고 싶지 않을 것입니다. – ceejayoz

+0

테이블에 수백만 개의 행이 포함되어 있지만 그 중 일부만 결과를 포함한다고 가정합니다. – KyleK

+0

Before and After에 필터를 추가하면 파일에 출력을 캐싱 할 수 있습니다.이 방법을 사용하면 다음 번에 데이터베이스에 변경 사항이 적용될 때까지 정적 파일 내용을 서버에 배치 할 수 있습니다. – Burimi

답변

1

() 메소드는 SQL을 호출합니다. 결과를 얻은 후에는 사용할 수 없습니다. 따라서 PHP로 필터링해야합니다 :

$lastYearData = array_filter($alldata, function ($value) { 
    return $value['date']->diffInDays() <= 365; 
}); 
+1

좋은 답변이지만, 수백만 행에 대해 이야기 할 때 SQL에서이 작업을 수행하는 것이 훨씬 더 효과적 일 것이라는 점에 유의해야합니다. 이것은 한 줄씩 하나씩 지나야합니다. – ceejayoz

+0

테이블에 결과에 포함 된 수백만 개의 행이 포함되어있는 것은 아닙니다. 예를 들어, 10,000 개의 활동 번호가있는 경우. – KyleK

+0

네,하지만 OP는 그들이 모두 4M 행인'Data :: all(); '을 캐싱하고 있음을 보여줍니다. – ceejayoz

0

PHP에서 '캐시'는 PHP가 요청 처리를 완료하면 지워지므로 작동하지 않습니다.

적절한 테이블 인덱스를 사용하면 쿼리에 많은 시간이 걸리지 않습니다. 또한 MySQL은 캐싱을 수행하므로 쿼리의 WHERE 조건이 많이 변경되지 않는 한 PHP 측에서 캐싱을 구현할 필요가 없습니다.

MySQL 명령 줄에서 30 초 쿼리를 두 번 연속 실행하십시오. 두 번째 실행이 첫 번째 실행보다 빠르게 돌아 오는 것을 확인할 수 있습니다.