Laravel 7 имеет ('отношение') с разбиением на страницы, замедляет запрос - PullRequest
0 голосов
/ 16 марта 2020

У меня есть фильтр Post::with('media')->has('media')->paginate(50) У меня есть 350 тыс. Строк в таблице публикаций и 270 тыс. Строк в медиафайлах

У меня есть индекс в медиа-таблице model_id и model_type поля и таблица сообщений published_at поле.

Первый запрос:

SELECT
    count(*) AS aggregate
FROM
    `posts`
WHERE
    EXISTS (
        SELECT
            *
        FROM
            `media`
        WHERE
            `posts`.`id` = `media`.`model_id`
            AND `media`.`model_type` = 'App\Models\Post'
    )

Выполнение: 972 мс

Второй запрос:

SELECT
    *
FROM
    `posts`
WHERE
    EXISTS (
        SELECT
            *
        FROM
            `media`
        WHERE
            `posts`.`id` = `media`.`model_id`
            AND `media`.`model_type` = 'App\Models\Post'
    )
    ORDER BY
        `published_at` DESC
    LIMIT 50 OFFSET 0

Выполнение: 1,7 с

1 Ответ

0 голосов
/ 16 марта 2020

Счет только вернул бы 1 строку

и Ваш select * 50 , который занимает просто время.

и проверить разницу между 2 запроса попробуйте ОБЪЯСНИТЬ

EXPLAIN  SELELCT...

, чтобы вы лучше разбирались в том, что mysql сделал с вашим запросом

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