Как лучше всего объединить таблицу, используя индексы

0

Следующий запрос работает очень медленно...

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

Может кто-нибудь объяснить, как оптимизировать этот запрос?

Снимок экрана запроса EXPLAIN

  • 0
    Есть ли причина, по которой вы используете LEFT JOIN вместо INNER JOIN для комментариев пользователей?
  • 0
    составной индекс для всех этих полей или простой индекс для каждого?
Показать ещё 9 комментариев
Теги:
join
left-join

1 ответ

1

Перемещение 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)

  • 0
    Все лиды на данный момент имеют ID компании 1 ... для предстоящего обновления.
  • 0
    Внутреннее соединение является коммутативным и ассоциативным, поэтому я не думаю, что порядок должен иметь значение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню