$query->where() с большим массивом долго выполняется

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

$query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

есть запрос

Код: Выделить всё

$query->where([ $tableModel . '.category_id' => $currentCategory['children']]);
в $currentCategory['children'] 6541 ид-ов. в итоге запрос выполняется от 7 до 12 секунду. В чем проблема?
roker191
Сообщения: 15
Зарегистрирован: 2018.02.06, 14:44
Откуда: Харьков

Re: $query->where() с большим массивом долго выполняется

Сообщение roker191 »

Проблема в запросе, думайте другую логику, yii сформирует запрос быстро, он будет, примерно таким ... WHERE category_id IN (1, 2, ... 6541) и пока сервер sql сделает выборку, пройдет много времени.
"Все было хорошо, пока программирование не стало работой"
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: $query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

roker191 писал(а): 2018.02.07, 22:31 Проблема в запросе, думайте другую логику, yii сформирует запрос быстро, он будет, примерно таким ... WHERE category_id IN (1, 2, ... 6541) и пока сервер sql сделает выборку, пройдет много времени.
время самого запроса не большое, с ним проблем нет
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: $query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

Люди добрые!!! Что с YII не так, почему он так тяжело переносит большие массивы в запросе?)
roker191
Сообщения: 15
Зарегистрирован: 2018.02.06, 14:44
Откуда: Харьков

Re: $query->where() с большим массивом долго выполняется

Сообщение roker191 »

Wizard писал(а): 2018.02.07, 22:32
roker191 писал(а): 2018.02.07, 22:31 Проблема в запросе, думайте другую логику, yii сформирует запрос быстро, он будет, примерно таким ... WHERE category_id IN (1, 2, ... 6541) и пока сервер sql сделает выборку, пройдет много времени.
время самого запроса не большое, с ним проблем нет
Кстати, да, вы правы. Посмотрел ближе код yii, все таки от перебирает массив с id в цикле с проверками, вот оно и виснет
"Все было хорошо, пока программирование не стало работой"
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: $query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

roker191 писал(а): 2018.02.07, 22:50
Wizard писал(а): 2018.02.07, 22:32
roker191 писал(а): 2018.02.07, 22:31 Проблема в запросе, думайте другую логику, yii сформирует запрос быстро, он будет, примерно таким ... WHERE category_id IN (1, 2, ... 6541) и пока сервер sql сделает выборку, пройдет много времени.
время самого запроса не большое, с ним проблем нет
Кстати, да, вы правы. Посмотрел ближе код yii, все таки от перебирает массив с id в цикле с проверками, вот оно и виснет
чего делать, костыли придумывать?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: $query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

собственно
$query->where($tableModel . '.category_id in ('. implode(', ', $currentCategory['children']) .')');
но как то это странно((
roker191
Сообщения: 15
Зарегистрирован: 2018.02.06, 14:44
Откуда: Харьков

Re: $query->where() с большим массивом долго выполняется

Сообщение roker191 »

Wizard писал(а): 2018.02.07, 23:08 собственно
$query->where($tableModel . '.category_id in ('. implode(', ', $currentCategory['children']) .')');
но как то это странно((
Да, но обычно не дергают записи таким запросом, если только по другому нельзя
"Все было хорошо, пока программирование не стало работой"
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: $query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

roker191 писал(а): 2018.02.07, 23:26
Wizard писал(а): 2018.02.07, 23:08 собственно
$query->where($tableModel . '.category_id in ('. implode(', ', $currentCategory['children']) .')');
но как то это странно((
Да, но обычно не дергают записи таким запросом, если только по другому нельзя
ммм... а как быть если мне необходимо достать все товары по category_id? Это хорошо что нет промежуточной таблицы для множественной привязки категорий) возможно есть какая то хитрость, но я пока не встречал) есть вариант children-ы всех категорий воткнуть в таблицу и через нее делать запрос, что то вроде....
category_id in (select children_id from categories_children where parent_id = :currentCategoryId)
но встает вопрос о производительности при редактировании категорий, можно неожиданно получить падение на пол пути))), так ка в моем случае их 9к. Возможно есть другие варианты...
roker191
Сообщения: 15
Зарегистрирован: 2018.02.06, 14:44
Откуда: Харьков

Re: $query->where() с большим массивом долго выполняется

Сообщение roker191 »

Код: Выделить всё

а как быть если мне необходимо достать все товары по category_id?
Я не совсем знаю задачу, струтуру и т.д., но можно сделать связи в моделях, и как-то так оформить запрос

Код: Выделить всё

$query->joinWith(['categories_children' => function ($q) {
            $q->where('categories_children.parent_id = :currentCategoryId');
        }]);
В общем, покопать в том направлении. https://yiiframework.com.ua/ru/doc/guid ... -relations
"Все было хорошо, пока программирование не стало работой"
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: $query->where() с большим массивом долго выполняется

Сообщение someweb »

Wizard писал(а): 2018.02.07, 23:33 но встает вопрос о производительности при редактировании категорий, можно неожиданно получить падение на пол пути))), так ка в моем случае их 9к. Возможно есть другие варианты...
Можно ресурсоёмкие операции кидать в очередь и блокировать mutex ом.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: $query->where() с большим массивом долго выполняется

Сообщение kukuruku »

потому что создается 6000 объектов ar
попробуй asArray
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: $query->where() с большим массивом долго выполняется

Сообщение BalykhinAS »

kukuruku писал(а): 2018.02.08, 11:16 потому что создается 6000 объектов ar
попробуй asArray
для построение "катры" категорий я само собой не использую объекты, это маразм)) категории выбираются из базы одним запросом

проблема как сказали выше в том что yii делает проверку массива
panda
Сообщения: 14
Зарегистрирован: 2017.07.18, 16:16

Re: $query->where() с большим массивом долго выполняется

Сообщение panda »

Wizard писал(а): 2018.02.08, 14:20 проблема как сказали выше в том что yii делает проверку массива
Тоже сталкивалась с этой проблемой. В итоге делаю через implode везде, где может ожидаться большое количество $id.

Я бы назвала это багом.
steaze
Сообщения: 30
Зарегистрирован: 2017.01.28, 21:25

Re: $query->where() с большим массивом долго выполняется

Сообщение steaze »

Это какая-то дичь, неужели нельзя сделать подзапрос и отдать обработку в руки sql-сервера?
Ответить