@TanykaGURU

Запрос с 2-мя leftjoin в базу с более 2-х тысяч записей, сжирает всю память и процессор и виснет, что не так?

Запрос с 2-мя leftjoin в базу с более 2-х тысяч записей, сжирает всю память/процессор и виснет в процессах Mysqld, что не так?
PHP Fatal error:  Allowed memory size of xxxxxxxxx bytes exhausted (tried to allocate xxxxx bytes) in vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 336


Имею такой запрос:
$data = Model::where('table1.name', $name)
				->leftJoin('table2', 'table1.phone', '=', 'table2.phone')
                ->leftjoin('table3', 'table1.phone', '=', 'table3.phone')
                ->select('table3.email', 'table3.param1', 'table3.param2', 'table3.param3', 'table2.city', 'table2.info', 'table2.info2', 'table2.info3', 'table1.name', 'table1.phone', 'table1.data', 'table1.data1', 'table1.data2', 'table1.data3', 'table1.data4 AS new', 'table1.created_at', 'table1.id')
                ->get();

return Datatables::of($data)
            ->addColumn('edit', '')
            ->editColumn('data', function (Model $model) {
                $md = ($model->data == 0 ? 'yes' : $model->data);
                return $md;
            })
            ->editColumn('new', function (Model $model) {
                $new = ($model->new ? 'yes' : 'no');
                return $new;
            })
            ->editColumn('data1', function (Model $model) {
                $dt = ($model->data1 == 1 ? 'yes' : 'no');
                return $dt;
            })
            ->editColumn('created_at', function (Model $model) {
                $date = date('Y-m-d H:i:s', strtotime($model->created_at) ); // H:i:s
                return $date;
            })
            ->rawColumns(['edit'])
            ->make(true);


Что я делаю не так? Ведь это еще не большое количество записей.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@TanykaGURU Автор вопроса
Отказался от datatables, в пользу пагинатора, все стало очень шустрым и удобным.
$data = $this->postback->whereNotNull('table1.phone')
				->where('table1.name', $name)
				->leftJoin('table2', 'table1.phone', '=', 'table2.phone')
		    ->leftjoin('table3', 'table1.phone', '=', 'table3.phone')
		    ->select(
					'table3.email', 'table3.param1', 'table3.param2', 
					'table2.info', 'table2.info1', 'table2.info2', 'table2.info3', 'table2.info4', 
					'table1.name', 'table1.data', 'table1.data1', 'table1.data2', 'table1.data3', 'table1.phone', 'table1.data4 AS new', 'table1.created_at', 'table1.id'
				)
		    ->orderBy('table1.created_at','asc')
        ->paginate($paginator);
		return $data;


P.S. использовав отношения вместо leftjoin, таблица еще быстрее стала.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Kostik_1993
Fullstack Web Developer | PHP | Laravel | Vue.js
Дело тут не в запросе вовсе. Память жрет не база а PHP. Сначала ты получаешь эти 2к записей, кладешь их в память, далее ты создаешь второй объект и также кладешь его в память + генерируешь JSON из этих записей, а это очень дорогая операция по ресурсам
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
Есть ли в таблицах одинаковые значения, причем в больших количествах? Например пустой телефон? Если, допустим, в каждой таблице 100 пустых телефонов, то в результате будет минимум 1000000 строк
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы