169 похожих чатов

Всем привет. Кто знает почему может тормозить запрос именно через

php когда его делает laravel ? Беру этот же запрос из clockwork и запускаю в консоли - выполняется в разы быстрее

37 ответов

97 просмотров

профилировщик знает

Ты, конечно, попробовал сделать запрос через чистый php pdo?

Jazz- Автор вопроса
Артём
Ты, конечно, попробовал сделать запрос через чисты...

для начала попробовал сделать DB::select(DB::raw(«…»)) из tinker с этим запросом … и вуаля! запрос выполнился быстро (ну в моем случае 5 сек это быстро :)) Получается что где то тупит построитель запросов? потому, что обложил именно построение запроса и вызов его конструкциями DB::enableQueryLog (); DB::getQueryLog () и получил 19 сек в выводе … ладно пойду копать дальше

Jazz
для начала попробовал сделать DB::select(DB::raw(«...

Да ты шо! Не РНР виноват, а твой код? Отэта поворот!

Jazz- Автор вопроса

дак самое то странное что код то простой … строю запрос через построитель DB::table ()->select() … потом соответвенно извлекаю данные… и вот тут прикол - если я этот же самый $query приведу в sql подставлю ему bindings и выполню его через DB::select ( DB::raw ( $rawQuery ) ) все выполняется быстро … и это при том, что билдер у меня не элокуент а базового класса \Illuminate\Database\Query\Builder … там по идее даже модели не извлекаются (что бы были накладные расходы какие то)

Jazz
дак самое то странное что код то простой … строю з...

а кол-во переменных попадающих под binding какое? когда большое кол-во племенных в запросе, может тормозить подготовка запроса. также запрос использует индексы? если да, то возможно индексы цифровые, а на вход летят строки или наоборот, потому и тормозит выборка

Jazz- Автор вопроса
Валерий Лопатин
А как ты его в скуль приводишь?

$query = $this->buildQuery (); // здесь говится выборка накладываются условия, джойны сортировки и тп, возвращает Builder $query = $query->offset ( $this->start )->limit ( $this->limit ); // далее перевожу его в sql и заполняю параметры $rawQuery = str_replace ( array('?'), array('\'%s\''), $query->toSql () ); $rawQuery = vsprintf ( $rawQuery, $query->getBindings () ); // вызываю DB::select ( DB::raw ( $rawQuery ) );// вот этот вызов в 5 раз быстрее!!! чем просто вызов $query->get()… время замерял и через DB::getQuerylog и просто через microtime()

Jazz
$query = $this->buildQuery (); // здесь говится вы...

Чел, ты серьёзно пишешь array() в 2023? Или это какое-то тошнотное легаси?

Jazz- Автор вопроса
Egor Gruzdev
а кол-во переменных попадающих под binding какое? ...

дело не виндексах … я сравниваю запуск одно и того же запроса через Builder->get() и DB::select(rawsql) … время построения билдером самого запроса я замерил - им можно принебречь

Артём
Чел, ты серьёзно пишешь array() в 2023? Или это ка...

А что против array?=))) Он если что быстрей чем []=)

Jazz- Автор вопроса
Jazz
дело не виндексах … я сравниваю запуск одно и того...

когда в запросе для подготовки ?, ?, ? ... и таких будет 5-10 тыс. то только одна подготовка может занять от 0.5-3 секунда, а когда ты делаешь raw то подготовка не требуется, я проэто

Артём
Есть пруфы?

Движок вначале спарсит [] и переведёт его в array() можно конечно по баловаться с замерами самому, если есть сильное желание поищу завтра статей с уже готовыми замерами

Jazz- Автор вопроса
Egor Gruzdev
когда в запросе для подготовки ?, ?, ? ... и таких...

я говорю же … замерял время подготовки и в этом случае там всего два ?

Вадим
быстрее на 0,0000000001?

Ну может чуть быстрей. Просто сам факт=)))

Jazz
я говорю же … замерял время подготовки и в этом сл...

покажи, если не секрет, вывод toSql() на QueryBuilder

Jazz- Автор вопроса
Egor Gruzdev
покажи, если не секрет, вывод toSql() на QueryBuil...

select wc_orders.id from `wc_orders` inner join `order_product` on `order_product`.`order_id` = `wc_orders`.`id` inner join `wc_products` on `order_product`.`product_id` = `wc_products`.`id` where (LOWER(wc_products.primary_name) regexp ? or LOWER(wc_products.permalink) regexp ?) group by `wc_orders`.id, wc_orders.created_at, wc_orders.id, wc_orders.created_at order by wc_orders.created_at desc

Jazz
дело не виндексах … я сравниваю запуск одно и того...

А билдер после запроса не гидрирует модели ? В ларке это тоже довольно дорогая операция. Сделай select(id) посмотри по времени. Вообще медленные запросы надо ловить, делать их через raw и модно много выиграть )

Jazz- Автор вопроса
E V.
А билдер после запроса не гидрирует модели ? В лар...

ну собственно я этим и занимаюсь 🙂 просто увидел что не просто запрос тормозит а тормозит именно через билер 🙂 … модели билдер не должен извлекать это же базовый билдер а не Eloquent …. или я ошибаюсь?

Jazz- Автор вопроса

и вряд ли в моделях дело (в смысле не извлекает он их) поому, что Builder->count() занимает столько же времени сколько Builder->get()

Jazz
и вряд ли в моделях дело (в смысле не извлекает он...

У билдера есть методы типо first, count, get. Поставь измерение таймингов до этой точки и посмотри сколько занимает ) так поймёшь билдер долго собирается или запрос сам) Потом после этого запроса посмотри, гидрирует ли билдер что то и сколько жто займёт времени

Jazz- Автор вопроса
E V.
У билдера есть методы типо first, count, get. Пост...

проверил билдерские get count first pluck и сырой запрос … билдерские все одиннаковое время и в 3 раза дольше чем сырой (на большой базе разница растет существенно) … дебагбаром посмотрел извлекалилсь ли модели - нет

Валерий Лопатин
А что против array?=))) Он если что быстрей чем []...

https://stackoverflow.com/a/56724706 сдаётся мне, ты забыл/перепутал

Jazz- Автор вопроса
Артём
Третий бенч пропустил?

в третем он тестирует снова первый на горячий проц 🙂 имхо тест не равноценный

Jazz
проверил билдерские get count first pluck и сыро...

Я тебе говорю найди эти методы в билдере и посмотри до того как запрос пойдёт на базу посмотри сколько времени занимает )

Jazz
ааа … ок

Я тут в кишках лары такую дичь нашёл)) можно предположить что где то строится не самым оптимальным образом что нибудь )

Jazz- Автор вопроса
Jazz
да там дичи хватает

Ну я увидел не просто магию, а debug_backtrqce извлекает трассировку всю, забирает с неё третий элемент массива и после этого на нем строит логику 😁

Jazz- Автор вопроса
E V.
Ну я увидел не просто магию, а debug_backtrqce изв...

ну кстати нормальный вариант … я у них его подглядел и гдето себе вкорячил тоже … но не как логику конечно :)) а именно как дебаг :)) … а как логику использовать - конечно дичь

Jazz- Автор вопроса

ну что … как я ипредполагал изначально … тупит драйвер PDO 🙁 если запрос приходит с параметрами ? то они биндятся а если без параметров (они под катом все равно биндятся просто биндить нечего) … то запрос выполняется в разы быстрее

Jazz- Автор вопроса
Jazz
ну что … как я ипредполагал изначально … тупит дра...

и еще fetchAll() там тоже почему-то занимает столько же времени сколько execute() и в случае с биндингом тоже дольше в разы … что вобще странно тк объем данных то одиннаков

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта