Mysql按时间间隔分组优化
我有一个非常大的表(数亿行),它存储测试结果以及一个datetime和一个名为“link”的相关实体的外键,我需要按10、15、20、30和60分钟的时间间隔对行进行分组,并按时间和“link_id”进行筛选。我知道可以使用此查询完成此操作,如[here][1]所述:Mysql按时间间隔分组优化,mysql,sql,database,optimization,indexing,Mysql,Sql,Database,Optimization,Indexing,我有一个非常大的表(数亿行),它存储测试结果以及一个datetime和一个名为“link”的相关实体的外键,我需要按10、15、20、30和60分钟的时间间隔对行进行分组,并按时间和“link_id”进行筛选。我知道可以使用此查询完成此操作,如[here][1]所述: SELECT time,AVG(RTT),MIN(RTT),MAX(RTT),COUNT(*) FROM trace WHERE link_id=1 AND time>='2015-01-01' AND time <
SELECT time,AVG(RTT),MIN(RTT),MAX(RTT),COUNT(*) FROM trace
WHERE link_id=1 AND time>='2015-01-01' AND time <= '2015-01-30'
GROUP BY UNIX_TIMESTAMP(time) DIV 600;
成为:
id | time | rtt | link_id | time_60 |time_30 ...
1 | 2014-01-01 12:34:55.4034 | 154.3 | 2 | 2014-01-01 12:00:00.00 | 2014-01-01 12:30:00.00 ...
我通过以下查询得到时间间隔:
SELECT time_10,AVG(RTT),MIN(RTT),MAX(RTT),COUNT(*) FROM trace
WHERE link_id=1 AND time>='2015-01-01' AND time <= '2015-01-30'
GROUP BY time_10;
这些是表索引:
+------------+------------+----------------------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------------------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| main_trace | 0 | PRIMARY | 1 | id | A | 2956718 | NULL | NULL | | BTREE | | |
| main_trace | 1 | main_trace_link_id_c6febb11f84677f_fk_main_link_id | 1 | link_id | A | 2 | NULL | NULL | | BTREE | | |
| main_trace | 1 | main_trace_07cc694b | 1 | time | A | 2956718 | NULL | NULL | | BTREE | | |
| main_trace | 1 | main_trace_e7549e3e | 1 | time_10 | A | 22230 | NULL | NULL | YES | BTREE | | |
| main_trace | 1 | main_trace_01af8333 | 1 | time_15 | A | 14783 | NULL | NULL | YES | BTREE | | |
| main_trace | 1 | main_trace_1681ff94 | 1 | time_20 | A | 10870 | NULL | NULL | YES | BTREE | | |
| main_trace | 1 | main_trace_f7c28c93 | 1 | time_30 | A | 6399 | NULL | NULL | YES | BTREE | | |
| main_trace | 1 | main_trace_0f29fcc5 | 1 | time_60 | A | 3390 | NULL | NULL | YES | BTREE | | |
+------------+------------+----------------------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
对于此查询:
SELECT time_10, AVG(RTT), MIN(RTT), MAX(RTT), COUNT(*)
FROM trace
WHERE link_id = 1 AND time >= '2015-01-01' AND time <= '2015-01-30'
GROUP BY time_10;
选择时间\u 10、平均(RTT)、最小(RTT)、最大(RTT)、计数(*)
追踪
其中link_id=1,time>='2015-01-01'和time,用于此查询:
SELECT time_10, AVG(RTT), MIN(RTT), MAX(RTT), COUNT(*)
FROM trace
WHERE link_id = 1 AND time >= '2015-01-01' AND time <= '2015-01-30'
GROUP BY time_10;
选择时间\u 10、平均(RTT)、最小(RTT)、最大(RTT)、计数(*)
追踪
其中link_id=1,time>='2015-01-01'和time,用于此查询:
SELECT time_10, AVG(RTT), MIN(RTT), MAX(RTT), COUNT(*)
FROM trace
WHERE link_id = 1 AND time >= '2015-01-01' AND time <= '2015-01-30'
GROUP BY time_10;
选择时间\u 10、平均(RTT)、最小(RTT)、最大(RTT)、计数(*)
追踪
其中link_id=1,time>='2015-01-01'和time,用于此查询:
SELECT time_10, AVG(RTT), MIN(RTT), MAX(RTT), COUNT(*)
FROM trace
WHERE link_id = 1 AND time >= '2015-01-01' AND time <= '2015-01-30'
GROUP BY time_10;
选择时间\u 10、平均(RTT)、最小(RTT)、最大(RTT)、计数(*)
追踪
其中,link_id=1和time>='2015-01-01'和time在(id,time)上的一个复合索引后跟一个潜在的analyze table trace
将使其变得简洁
这只是一个建议,我不是说去做。分析表可能需要一些人几个小时才能运行数百万行
建议仅基于一个查询创建索引不是一个好主意。假设是这样,您还有其他查询。它们是一个拖拽式插入/更新。在(id,时间)上的一个复合索引,后跟一个潜在的分析表跟踪,这会使它很快
这只是一个建议,我不是说去做。分析表可能需要一些人几个小时才能运行数百万行
建议仅基于一个查询创建索引不是一个好主意。假设是这样,您还有其他查询。它们是一个拖拽式插入/更新。在(id,时间)上的一个复合索引,后跟一个潜在的分析表跟踪,这会使它很快
这只是一个建议,我不是说去做。分析表可能需要一些人几个小时才能运行数百万行
建议仅基于一个查询创建索引不是一个好主意。假设是这样,您还有其他查询。它们是一个拖拽式插入/更新。在(id,时间)上的一个复合索引,后跟一个潜在的分析表跟踪,这会使它很快
这只是一个建议,我不是说去做。分析表可能需要一些人几个小时才能运行数百万行
建议仅基于一个查询创建索引不是一个好主意。假设是这样,您还有其他查询。它们是拖拽式插入/更新。time='2015-01-01'
时间<'2015-01-01'+间隔1个月
如果这是静态数据(例如一次写入的数据仓库),您可以通过构建和维护来加快查询速度。time='2015-01-01'
时间<'2015-01-01'+间隔1个月
如果这是静态数据(例如一次写入的数据仓库),您可以通过构建和维护来加快查询速度。time='2015-01-01'
时间<'2015-01-01'+间隔1个月
如果这是静态数据(例如一次写入的数据仓库),您可以通过构建和维护来加快查询速度。time='2015-01-01'
时间<'2015-01-01'+间隔1个月
如果这是静态数据(例如一次写入的数据仓库),则可以通过构建和维护来加快查询速度。为什么要在该索引中包含rtt?也。。。我应该为每个timex列创建这样的索引吗?我有时间10,时间15,时间20,时间30和时间_60@JesusGomez . . . 这使它成为查询的覆盖索引。整个查询可以使用索引。可能不需要转到数据页。就性能而言,是的。但是,我会尝试使用跟踪(link\u id,time,rtt)
上的索引运行原始查询。也许您不需要额外的列。尝试了两种方法,首先我添加了一个跟踪(link\u id,time,rtt)并尝试了两种查询,但没有任何性能改进,然后我添加了覆盖索引跟踪(link\u id,time,time\u 10,rtt),查询只需2秒钟即可完成。我有点担心在一个表中有这么多索引的插入时间。@JesusGomez。索引中的列数对性能有(非常、非常小)影响。为什么要在该索引中包含rtt?也。。。我应该为每个timex列创建这样的索引吗?我有时间10,时间15,时间20,时间30和时间_60@JesusGomez . . . 这使它成为查询的覆盖索引。整个查询可以使用索引。可能不需要转到数据页。就性能而言,是的。但是,我会尝试使用跟踪(link\u id,time,rtt)
上的索引运行原始查询。也许您不需要额外的列。尝试了两种方法,首先我添加了一个跟踪(link\u id,time,rtt)并尝试了两种查询,但没有任何性能改进,然后我添加了覆盖索引跟踪(link\u id,time,time\u 10,rtt),查询只需2秒钟即可完成。我有点担心在一个表中有这么多索引的插入时间。@JesusGomez。索引中的列数对性能有(非常、非常小)影响。为什么要在该索引中包含rtt?也。。。我应该为每个timex列创建这样的索引吗?我有时间10,时间15,时间20,时间30和时间_60@JesusGomez . . . 这使它成为查询的覆盖索引。整个查询可以使用索引。可能不需要转到数据页。就性能而言,是的。但是,我会尝试使用跟踪(link\u id,time,rtt)
上的索引运行原始查询。也许您不需要额外的列。尝试了两种方法,首先我添加了一个跟踪(link_id,time,rtt),并尝试了两种查询,但没有任何性能改进,然后