Где СУЩЕСТВУЕТ замедление запроса - PullRequest
0 голосов
/ 16 марта 2020

Этот запрос занимает много времени. Я использую индекс для model_id, model_type полей.

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

У меня есть 350 тыс. Строк в posts и 270 тыс. Строк в media.

Запрос:

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

Выполнить: 1,23 с

Ответы [ 3 ]

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

Сначала отфильтруйте строки таблицы media, затем присоединитесь к posts и подсчитайте:

SELECT Count(*) AS aggregate
FROM posts p
INNER JOIN (
  SELECT model_id
  FROM media
  WHERE model_type = 'App\Models\Post'
) m ON m.model_id = p.id

В зависимости от ваших данных вы можете использовать COUNT(DISTINCT p.id) вместо COUNT(*).

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

Исходя из одного предположения, что у каждого media есть одно сообщение, а не много, ваш запрос может быть упрощен до:

select count(distinct model_id)
from media
where model_type = 'App\Models\Post'

, чтобы эффективно выполнить комбинированный индекс model_type, model_id, например ниже поможет, если не существует:

ALTER TABLE media ADD INDEX model_type_id(model_type, model_id);
0 голосов
/ 16 марта 2020

Вы пробовали нормальное объединение вместо

select count(p.id)
from posts p
join media m on p.id = m.model_id
where m.model_type = 'App\Models\Post'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...