mysql - 如何使用索引最好地连接表
问题描述
以下查询运行非常缓慢...
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 的索引
有人可以解释如何优化这个查询吗?
解决方案
移动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)
推荐阅读
- sql-server - Azure DevOps SQL Server 数据库部署任务中的错误未失败管道
- html - HTML5 视频无法在 Safari Mobile 上播放
- c# - 如何获取 TreeViewItem 的父对象
- python - screen.fill 不显示背景颜色
- python - KeyError:“尝试创建 Pyomo 约束时,不能将标量组件 'pv_gcr_roof' 视为索引组件”
- java - xtext 格式的 Drools 规则
- javascript - 如何使用 reactjs 上传图片
- angular - 添加元标记在 Angular 6 中不起作用
- c# - 如何禁止对过时属性的所有用法发出警告?
- javascript - 引导可折叠选项禁用