Простой запрос медленный в Laravel, но безумно быстрый в консоли базы данных - PullRequest
5 голосов
/ 07 апреля 2019

У меня очень странная проблема - я не могу разобраться.Я использую Laravel для своего бэкэнд-приложения, где я выполняю очень простой запрос к таблице с 30 тыс. Записей, с правильными индексами.Вот запрос:

DB::select('select * from Orders where ClientId = ?', [$id])

Из приложения Laravel этот запрос выполняется в течение 1,2 секунды (то же самое, если я использую модель Eloquent.):

    "query" => "select * from Orders where ClientId = ?"
    "bindings" => array:1 [▼
      0 => "44087"
    ]
    "time" => 1015.2

Проблема в том, что если я запускаю один и тот же запрос внутри консоли базы данных или PHPMyAdmin, запрос занимает приблизительно 20 миллисекунд.

Я не понимаю, как это возможно, поскольку я использую ту же базу данных, тот же запрос, тот же компьютер и то же соединение с базой данных.

В чем может быть причина?

Ответы [ 6 ]

1 голос
/ 19 апреля 2019

PHPMyAdmin автоматически добавит LIMIT для вас.

Это потому, что PHPMyAdmin по умолчанию всегда разбивает ваш запрос на страницы.

В вашем запросе Laravel / Eloquent вы загружаете все 30 тыс. Записей за один раз. Это должно занять время.

Чтобы исправить это, попробуйте pagination или chunking ваш запрос.

Все это займет много времени, да, но сами куски будут очень быстрыми.

0 голосов
/ 19 апреля 2019

Запрос должен иметь одинаковую скорость в phpmyadmin, иначе приложение пытается использовать оператор объяснения, чтобы увидеть более подробную информацию о запросе

Причиной этого конфликта может быть множество причин, отличных от MySQL, например

Сам скрипт php имеет некоторые функции, которые вызывают медленную загрузку Попробуйте проверить сервер error.log, возможно, есть ошибки в функциях

По сути, phpmyadmin может отличаться от larval в функции подключения MySQL. Попробуйте проверить расширение, используемое в подключении. Возможно, оно несовместимо с используемой версией php, и я думаю, что это причина медленного запроса

Я заметил, что в некоторых приложениях, которые я сделал, причина была всегда в функциях php или в соединении, как, например, mysql_connect был намного быстрее, чем расширение PDO на php <5.6, но причина всегда была из функций php в сценарий </p>

0 голосов
/ 19 апреля 2019

Здесь есть несколько проблем.Во-первых, как работает Laravel.Laravel загружает только те сервисы и классы, которые выполняются во время вашего скрипта.Это сделано для экономии ресурсов, так как PHP предназначен для запуска в виде CGI-скрипта, а не длительного процесса.В результате ваше время может включать в себя этап настройки соединения, а не просто выполнение запроса.Чтобы получить более «надежный» результат, выполните любой запрос, прежде чем синхронизировать ваш простой запрос.

Есть и другая сторона этого поведения.В долгосрочном процессе, таком как Job runner, вам не следует изменять параметры сервиса.Это может вызвать нежелательное поведение и привести к тому, что изменения вашего параметра переместятся в другие задания.Например, если вы предоставляете функцию входа по SMTP, вы должны сбросить учетные данные отправителя электронной почты после отправки электронного письма, в противном случае вы столкнетесь с проблемой, когда пользователь, не использующий эту функцию, отправит электронное письмо как другой пользователь, который это делает.Это происходит из-за того, что сервисы перезагружаются при каждом выполнении задания, как, например, при работе HTTP-части.

Во-вторых, вы не используете лимит.Как отмечали некоторые другие плакаты.

0 голосов
/ 18 апреля 2019
  1. Как включить MySQL Query Log?
  2. Запустить запрос через phpmyadmin.
  3. Посмотреть, какие запросы у вас действительно есть в MySQL.
  4. Запустите приложение.
  5. Посмотрите, какие запросы у вас действительно есть в MySQL.
  6. Скажите нам, что это было за лишнее, что тормозит.
0 голосов
/ 07 апреля 2019

Я почти уверен, что это связано с лимитом использования PHPMyAdmin, связанным с тем, что вы видите в выводе страницы.

Если вы видите верхнюю часть страницы PHPMyAdmin, вы видите что-то вроде этого:

Отображение строк 0 - 24 (всего 314, запрос занял 0,0009 секунд.)

Вы должны иметь ту же производительность, когда добавляете ограничение к своему запросу.

0 голосов
/ 07 апреля 2019

Я бы попробовал отладить запросы с помощью панели отладки, чтобы увидеть, сколько времени это занимает, а что занимает больше времени ... Его очень легко использовать и устанавливать: https://github.com/barryvdh/laravel-debugbar Я думаю, что вы заинтересованыв администрациях БД .. читайте также, вы можете получить некоторую идею. удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...