首页 > 解决方案 > 如何使用索引最好地连接表

问题描述

以下查询运行非常缓慢...

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

潜在客户表有 ~ 8000 条记录用户表有 ~ 300 条记录评论表有 ~ 500,000 条记录

我有关于leads.id、comments.lead_id、leads.company_id、users.id 和comments.user_id、comments.sort、comments.reply、comments.id 的索引

有人可以解释如何优化这个查询吗?

查询说明截图

标签: mysqljoinleft-join

解决方案


移动leadsfrom列表中的第一个:

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)


推荐阅读