我的数据库中有400万行,我需要按时间过滤,因为你们都可以猜到问题与速度有关。
我目前正在使用remember
函数来缓存我的查询。但我有一些确切的查询,我的用户可以选择。我的意思是:
这意味着我有4个缓存查询...如果您运行没有缓存的查询,所有查询都需要大约30秒。
我想要的是在收到所有数据一次后对其进行过滤并缓存它。
这样我就可以使用所有数据来过滤我想要的内容。
使用一些代码更清楚一点:
<?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
?>
答案 0 :(得分:1)
where()方法将调用SQL所在的函数。获得结果后,您无法使用它。所以你必须用PHP过滤:
$lastYearData = array_filter($alldata, function ($value) {
return $value['date']->diffInDays() <= 365;
});
答案 1 :(得分:0)
PHP上的'缓存'将无法正常工作,因为一旦处理完请求,它就会被清除。
使用正确的表索引,您的查询不应该花费那么多时间。 此外,MySQL会进行缓存,因此您不必在PHP端实现缓存,除非您的查询的WHERE条件发生了很大变化。
尝试连续两次在MySQL命令行上运行30秒查询。您会注意到第二次运行将比第一次运行更快地返回。