Laravel. Почему разница в сотни раз в запросах по времени?

Если делаю так:
\DB::table('ratings')
        ->selectSub(function ($query) {
            return $query->selectRaw('SUM(ecology)');
        }, 'ecology')
        ->selectSub(function ($query) {
            return $query->selectRaw('SUM(social_protection)');
        }, 'social_protection')

        ->where('point', 'test')
        ->first();

Результат мгновенно
"time" => 2.0
Сам SQL получается такой:
select (select SUM(ecology)) as `ecology`,
(select SUM(social_protection)) as `social_protection`
from `ratings` where `point` = ? limit 1


Но если делаю напрямую через select:
\DB::select('select (select SUM(ecology)) as `ecology`,
(select SUM(social_protection)) as `social_protection`
from `ratings` where `point` = ? limit 1', ['test'])

То время увеличивается в сотни раз!!!
"time" => 787.87
Хотя запрос SQL такой же:
select (select SUM(ecology)) as `ecology`,
(select SUM(social_protection)) as `social_protection`
from `ratings` where `point` = ? limit 1

Почему такая разница?
  • Вопрос задан
  • 1388 просмотров
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Дело в том, что когда вы передаете вместо строки число, то происходит неявный вызов CAST.
Скорее всего ваш point строкового типа и поэтому CAST() выполняется для каждой строки, что существенно увеличивает время выполнения кода.

Добавлю описание вашего сценария
For comparisons of a string column with a number, MySQL cannot use an index on the column to look up the value quickly....

При сравнении строкового столбца с числом, MySQL не может использовать индекс для поиска значения.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Глупейший вопрос, ибо смысла использовать чистый SQL нет, так что можно было бы забить. Подписываюсь под ответом Нурлан
Ответ написан
Ваш ответ на вопрос

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

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