mysql - 如何优化 MySQL 慢查询
问题描述
我有以下 MySQL 查询,执行需要很长时间:
SELECT `market`.`name` AS `Markets`, count(*) * `clicks`.`cost` AS `Rev`
FROM `clicks`
INNER JOIN markets ON `clicks`.`market_id`= `markets`.`id`
WHERE clicks.created_date = `date1`
GROUP BY `markets`.`id`
ORDER BY `Rev` DESC
最初它非常慢,但后来我删除了多余的日期功能。仍然需要很长时间才能执行。有什么解决办法吗?
查询说明:我从一个表中选择市场名称,行数乘以另一个表中的成本。市场的 ID 在第一个表“点击”中定义,我从“市场”表中获取市场名称。此外,我通过市场 ID 对市场进行分组,并通过 Rev 降序排序
解决方案
您的查询正在滥用 MySQL部分按功能分组。您按市场分组,但有一个clicks.cost
不包含在聚合中的杂散列。无论您的查询速度有多快,您都会得到不正确的结果。
您可以按如下方式修改您的查询:
SELECT market.name AS Markets, subqry.Rev FROM (
SELECT market_id, SUM(cost) AS Rev
FROM clicks
WHERE created_date = 'some date'
GROUP BY market_id
) AS subqry
INNER JOIN markets ON subqry.market_id = markets.id
ORDER BY Rev DESC
确定结果正确后,创建以下索引:
CREATE INDEX ix_clicks ON clicks (created_date, market_id, cost)
推荐阅读
- sql - SQL CREATE FUNCTION 生成“没有这样的函数”错误
- javascript - 我的等待代码不会等待我的代码继续
- javascript - 有没有办法在没有文档的情况下找到哪些 API 参数有效?
- javascript - 创建钩子时出错(Promise/async):“TypeError:无法读取未定义的属性‘位置’”
- gremlin - gremlin 查询在控制台中有效,但在 javascript 中无效
- asp.net-core - Asp.Net Core 3.1 Web App(Razor Pages)SignalR - OnChange 事件在 SqlDependency 上多次命中,对于单个客户端
- python - 硒中的按钮不可点击,没有错误消息
- github-actions - 即使在主键上发生命中,也覆盖 github 操作缓存
- purescript - 由于使用了类型(行类型),类型类实例头部无效
- javascript - 如何递归地加入两个嵌套的可观察对象