mysql - 如何使用索引最好地连接表

标签 mysql join left-join

以下查询运行速度非常慢...

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 条记录 users 表有约 300 条记录 评论表有约 500,000 条记录

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

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

Screenshot of query EXPLAIN

最佳答案

线索移至来源列表中的第一个位置:

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/(company_id = 1 的潜在客户比例)

关于mysql - 如何使用索引最好地连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51734426/

相关文章:

mysql - 在MySQL中使用外键从另一个表的列中选择数据

mysql - 如何将我的 SQL 查询转换为 MongoDB 查询?

MySQL 查询 - 对使用内部查询不感兴趣

algorithm - 如何加速 geopandas 空间连接?

sql - 如何在 SQL 中为具有多个关系的相关地址创建新的标识符?

php - MySQL db 不使用 php 处理从表单更新

MySQL 在 phpMyAdmin 中查找和替换(删除)正则表达式

MySQL 永无止境 'Copying to tmp table' 与 db View 和 LEFT JOIN

php & mysql 创建连接查询

mysql - 通过多个子查询连接优化查询