Мое приложение имеет 10 миллионов записей.
Таблица компании:
+---+------+-----------+-------------+------------+
|id | name |country_id | industry_id | finance_id |
+---+------+-----------+-------------+------------+
| 1 |LOrel | 1 | 1 | 1 |
+---+------+-----------+-------------+------------+
Таблица стран:
+---+-----------+
|id | name |
+---+-----------+
| 1 | USA |
+---+-----------+
| 2 | Romania |
+---+-----------+
Таблица промышленности:
+---+-----------+
|id | name |
+---+-----------+
| 1 | Pharmacy |
+---+-----------+
| 2 | Software |
+---+-----------+
Таблица финансов:
+---+------------+------+--------+---------+------------+
|id | company_id | year |revenue | profit | loss |
+---+------------+------+--------+---------+------------+
| 1 | 1 | 2017 | 4,125 | 2045 | 750 |
+---+------------+------+--------+---------+------------+
| 2 | 1 | 2018 | 10,125 | 7045 | 125 |
+---+------------+------+--------+---------+------------+
| 3 | 2 | 2017 | 8,125 | 4045 | 750 |
+---+------------+------+--------+---------+------------+
| 4 | 3 | 2018 | 7,125 | 2045 | 125 |
+---+------------+------+--------+---------+------------+
Это моя структура базы данных.
Ожидаемый результат:
+---------+---------+----------+-----+--------+---------+
| Country | company | industry |year |revenue | profit |
+---------+---------+----------+-----+--------+---------+
| USA | LOrel | Pharmacy |2018 | 10,125 | 7045 |
+---------+---------+----------+-----+--------+---------+
Я получаю тот же результат, что я хочу, я использую laravel eager loading и yajra laravel datatables.
Теперь мне нужно отфильтровать данные с помощью ползунка диапазона, получение данных из БД занимает много времени.
$company_data = Company::whereBetween('revenue',$request->slider)
->with('country','industry','company_financial')
->skip($request->start)->take($request->length)->get();
заранее спасибо
Если вам нужно запускать этот запрос нечасто (то есть раз в неделю), загрузите задачу в очередь. Я бы предложил использовать Redis для водителя.
Начать с создание вакансии
// WeeklyQueryJob.php
protected $slider;
protected $start;
protected $length;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($slider, $start, $length)
{
$this->slider = $slider;
$this->start = $start;
$this->length = $length;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$company_data = Company::whereBetween('revenue',$this->slider)
->with('country','industry','company_financial')
->skip($this->start)
->take($this->length)
->get();
// add logic to store/email/whatever the results
}
Следующая настройка запланированное задание поставить в очередь задание
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->job(new WeeklyQueryJob)->weekly();
}
Затем добавьте запись в cron для запуска планировщика
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
Наконец, используйте супервизор для запустить работника очереди и поддерживать его работу
Других решений пока нет …