关于以下情况的解决方案,我进行了很多搜索,但不幸的是,我没有找到类似的情况。
我有以下情况:(作为新用户,网站拒绝了我的图片,但是我可以通过邮件发送它。下面是它的文字表示)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”中的“ ClusterName”显示)。 >
通过两个表“ SiteID”的公共列完成连接。请注意,在表2“单元”中,每个SiteID均包含3个不同的对象(“单元”)。因此,实际上我为每个单元格执行了“ Counter”的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“交换计划”:ClusterName-CHAR(30)
SiteID-VARCHAR(10)
表2“单元格”:SiteID-VARCHAR(10)
时间-DATETIME
Counter-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
使用的索引如下:
交换计划:索引1(1。ClusterName和2. SiteID)
单元格:Index_siteid(SiteID)
优化器在其中查找的行数很少,这很好:
交换计划:6066中的31个,单元格:660万中的368个。
我的问题是这些“使用临时;使用文件排序”。据我了解,这来自于Group By所需的排序(如果删除它,则不会根据Explain执行这些过程)。我发现为了避免它们,您需要在分组依据的列上有一个索引。我有一个仅包含“时间”列的特殊索引,但是即使有提示“ USE INDEX FOR GROUP BY()”,也不会使用该索引。
因此,我的查询运行速度不够快-大约需要15秒(比如说15个SiteID和10个日期),因此我需要将此持续时间至少减少一半。
我的主要问题是:完全可以删除“使用临时;使用文件排序”或减少执行它们所需的时间? (我试图增加读取缓冲区大小为16MB,无效)
在JOIN情况下,在WHERE子句中按不同表中的2列进行过滤,而在ON子句中按第三列进行过滤时,我需要什么样的索引定义
我可以应用哪种优化组(索引等)?
非常感谢!
我已经就下述情况的解决方案进行了大量搜索,但不幸的是,我还没有找到类似的情况。我有以下情况:(作为新用户,网站拒绝了我的图片,但是我...