Следующий запрос работает очень медленно...
SELECT
CONCAT(users.first_name, ' ', users.last_name) AS user_name,
leads.first_name AS first_name,
comments.*,
FROM comments
INNER JOIN users ON
users.id = comments.user_id
INNER JOIN leads ON
leads.id = comments.lead_id AND
leads.company_id = 1
ORDER BY
'sort' DESC,
reply ASC,
id ASC
LIMIT 80,20
таблица lead имеет ~ 8000 записей таблица пользователей имеет ~ 300 записей, таблица комментариев имеет ~ 500 000 записей
У меня есть индекс на leads.id, comments.lead_id, leader.company_id, users.id и комментарии.user_id, comments.sort, comments.reply, comments.id
Может кто-нибудь объяснить, как оптимизировать этот запрос?
Перемещение leads
к первому в списке from
списка:
SELECT
CONCAT(users.first_name, ' ', users.last_name) AS user_name,
leads.first_name AS first_name,
comments.*
FROM leads
INNER JOIN comments ON
comments.lead_id = leads.id
INNER JOIN users ON
users.id = comments.user_id
WHERE leads.company_id = 1
ORDER BY
'sort' DESC,
reply ASC,
id ASC
LIMIT 80,20
Это позволяет индексу leads(company)
немедленно отфильтровать как можно больше строк до присоединения к другим таблицам.
Увеличение производительности должно быть около 1/(fraction of leads with company_id = 1)
LEFT JOIN
вместоINNER JOIN
для комментариев пользователей?