我已经搜索了很多关于下面描述的案例的解决方案,但不幸的是我没有找到类似的案例。
我有以下情况:(作为新用户,网站拒绝了我的图片,但我可以通过邮件发送。下面是它的文字表示)
Table 1 "swap_plan" Table 2 "cell"
ClusterName | SiteID SiteID | Cell | Time | Counter
----------------------- ---------------------------------------------
Cluster A | SiteID A1 SiteID A1 | Cell A1-1 | day1 | 5
Cluster A | SiteID A2 SiteID A1 | Cell A1-1 | day2 | 3
Cluster A | SiteID A3 SiteID A1 | Cell A1-1 | day3 | 6
Cluster A | SiteID A4 SiteID A1 | Cell A1-2 | day1 | 6
Cluster A | SiteID A5 SiteID A1 | Cell A1-2 | day2 | 2
Cluster A | SiteID A6 SiteID A1 | Cell A1-2 | day3 | 9
....................... ..............................................
Cluster B | ......... ..............................................
(Where No 1) (ON Clause "SiteID") (Where No 2) Sum(Counter)
我必须显示一些性能指标(表 2“单元格”中的“计数器”),随时间聚合(表 2“单元格”中的“时间”)和集群(表 1“swap_plan”中的“集群名称”)。
连接是通过两个表“SiteID”的公共列完成的。请注意,在表 2“单元”中,每个 SiteID 由 3 个不同的对象(“单元”)组成。所以,实际上我为每个单元格做“计数器”的 SUM()。
查询如下:
SELECT ClusterName,Time,SUM(counter)
FROM cell
INNER JOIN swap_plan ON swap_plan.Siteid = cell.Siteid
WHERE ClusterName='Cluster A' AND Time>=day1 AND Time<=day2
GROUP BY Time
列类型如下:
表1“交换计划”:
- 集群名称 - CHAR(30)
- 站点 ID - VARCHAR(10)
表2“单元格”:
- 站点 ID - VARCHAR(10)
- 时间 - 日期时间
- 计数器 - INT
“解释”显示如下:
table type key key_len ref rows Extra
swap_plan ref Index 1 30 const 31 Using where; Using index; Using temporary; Using filesort
cell ref Index_siteid 13 swap_plan.SiteID 368 Using where
使用的索引如下:
swap_plan:索引 1(1. ClusterName 和 2. SiteID)
单元格:Index_siteid (SiteID)
优化器看起来的行数非常低,这很好:
交换计划:6066 中的 31 和单元:660 万中的 368。
我的问题是这些“使用临时;使用文件排序”。据我了解,这来自 Group By 所需的排序(如果我删除它,这些过程不会根据解释执行)。我发现为了避免它们,您需要在分组依据的列上有一个索引。我有一个只包括“时间”列的特殊索引,但这个索引没有被使用,即使有提示“使用索引 FOR GROUP BY ()”。
因此,我的查询运行速度不够快 - 大约需要 15 秒(比如说 15 个 SiteID 和 10 个日期),我需要将此持续时间减少到至少一半。
我的主要问题是:
- 是否有可能删除“使用临时;使用文件排序”或减少执行所需的时间?(我尝试将 Read Buffer Size 增加到 16MB,没有效果)
- 在 JOIN 情况下我需要什么样的索引定义,当在 WHERE 子句中我按不同表中的 2 列过滤时,在 ON 子句中我按第 3 列过滤
- 我可以应用什么样的 Group By 优化(索引等)?
非常感谢您!