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

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

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

37 ответов

33 просмотра

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

Ты, конечно, попробовал сделать запрос через чистый 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() и в случае с биндингом тоже дольше в разы … что вобще странно тк объем данных то одиннаков

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
думаешь я не смогу также сделать? мне это просто не удобно
int 💳 𝙖𝙞𝙧 𝙗𝙞𝙜 𝙗𝙤𝙗 🔫 check bio / spam block / AFK / nohello.com / GMT+3
9
Карта сайта