0 0

mysql百万级数据待优化(group by,sum)5

需求:
由于数据量极大,现在表的设计已经是一个月一个表。目前有二千多个设备,每小时上传一次数据。一个月就有2000*24小时*30=144万条。
表设计如下:
Rain201412
ObserveTime bigint
StationID varchar
Rain float
ObserveTime和StationID做了联合主键和索引

由于是灵活统计任意时段内的3小时,6小时,12小时,24小时的降水。每个正点时次设备因故障经常需要人工订正数据。

现在我统计2014年12月13日11时各设备的过去12小时降水
select sum(Rain) from  Rain201412 where ObserveTime in(201412130000,201412130100,201412130200,201412130300,201412130400,201412130500,201412130600,201412130700,201412130800,201412130900,201412131000,201412131100) group by StationID order by null

这段sql要运行3秒是什么问题?
2015年1月13日 10:52

9个答案 按时间排序 按投票排序

0 0

那个in可以去掉,可以在后面用and进行拼接  然后group by你看能用什么办法代替掉不
如果用其他写法代替之后还是不行,建议给列添加索引
另外,函数尽量少用,我上次用substring在sql里面写的时候只要0.2秒,但是部署到虚拟机上要跑1分钟

2016年3月24日 20:44
0 0

可以拆表。
可以建立3小时,6小时,12小时,24小时的表,通过存储过程和数据库定时任务来进行统计,插入到各自的表中

2015年1月28日 11:26
0 0

如果是固定的几个数据,in的效率和exists效率一样
如果in和exists后面用到了子查询,子查询的数据量比较大,exists比in高,数据量小,in效率比exists高

2015年1月28日 11:06
0 0

使用 exists试试看
我记得 exists 在一定条件下的效率要高上不少
刚刚找了找参考资料:
[url=http://blog.sina.com.cn/s/blog_63a48d250100sni4.html]in and exists效率问题
[/url]

2015年1月23日 14:52
0 0

select sum(Rain) from  Rain201412 where ObserveTime like '20141213%'group by StationID order by null
如果需要进一步限制可以加上 and ObserveTime in(201412130000,201412130100,201412130200,201412130300,201412130400,201412130500,201412130600,201412130700,201412130800,201412130900,201412131000,201412131100)

另,其实可考虑删除目前的索引,创建三个的联合索引ObserveTime,StationID,Rain
你可以测试一下

2015年1月13日 21:27
0 0

最好查询计划贴出来。
另外,联合索引做的顺序是什么?
先ObserveTime然后StationID吗?

这样的话,直接用StationID去分组是用不到索引的。
试试看分2个索引建立。

2015年1月13日 18:27
0 0

可以确认3个地方

1. oerder by "null" ?? 如果没有排序最好去掉,如果有排序,确认排序字段是否有索引
2. 如果可能,把in的方式改为 ObserveTime = xx and ObserveTime = yy ...
3. 适当的索引

2015年1月13日 18:20
0 0

用hadoop吧

2015年1月13日 15:53
0 0

将where条件修改为  between A and B 形式,这样的效率会高很多

2015年1月13日 13:51

相关推荐

    MySQL优化GROUP BY方案

    MySQL中的GROUP BY语句用于对数据进行分组并计算每个组的聚合函数,如COUNT(), SUM(), AVG(), MAX(), MIN()等。在处理大数据量时,优化GROUP BY语句至关重要,因为它直接影响到查询性能。本篇文章将深入探讨MySQL...

    深入解析mysql中order by与group by的顺序问题

    mysql 中order by 与group by的顺序是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group ...

    MySQL优化GROUP BY(松散索引扫描与紧凑索引扫描)

    MySQL中的GROUP BY语句用于对数据进行分组和聚合,通常与聚合函数(如COUNT、SUM、AVG等)一起使用。在处理大数据量时,优化GROUP BY操作至关重要,因为这直接影响查询性能。MySQL提供了几种优化策略,其中两种是...

    MySQL基础数据生成工具

    5. **练习查询**:生成的虚拟数据可以用于练习复杂的SQL查询,例如多表联接(JOIN)、子查询、聚合函数(COUNT, SUM, AVG, MAX, MIN)以及排序和分组(ORDER BY, GROUP BY)。 6. **索引概念**:学习如何为表的特定...

    mysql group by用法

    MySQL中的`GROUP BY`语句是用于对数据库中的数据进行分组,以便可以对每个分组执行聚合操作,如计算总和、平均值、最大值、最小值等。这个功能在数据分析和报表生成中非常常见,因为它允许我们按特定字段对数据进行...

    Mysql中错误使用SQL语句Groupby被兼容的情况

    在SQL中,`GROUP BY`语句用于对数据进行分组,通常与聚合函数(如`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`等)结合使用,以便对一组具有相同值的记录进行统计计算。然而,MySQL和其他数据库系统在处理`GROUP BY`时有...

    如何统计MySQL数据量大小

    在数据库管理中,了解MySQL数据量的大小是至关重要的,这有助于优化性能、规划存储空间以及进行容量规划。本文将详细讲解如何统计MySQL数据库的数据量大小,并涉及CONCAT函数的解读,以及对information_schema和...

    mysql高级参考课件(供实操参考).zip

    - 分组与聚合函数:GROUP BY、HAVING和聚合函数(如COUNT, SUM, AVG, MAX, MIN)用于统计和分析数据。 2. **存储过程与函数**: - 存储过程:预编译的SQL语句集合,可以提高执行效率,减少网络传输。 - 用户定义...

    MySQL高级查询之与Group By集合使用介绍

    MySQL中的`GROUP BY`语句是用于对数据进行分组,以便可以对每个分组执行聚合函数,如`SUM`, `COUNT`, `AVG`, `MAX`, `MIN`等。当你需要统计每个分组内的一些特定信息时,`GROUP BY`就显得非常有用。 在描述中提到,...

    mysql遇到Expression.docx

    `GROUP BY`用于对数据进行分组,允许你对每个分组应用聚合函数,如`COUNT()`, `SUM()`, `AVG()`, `MAX()`或`MIN()`。查询的`SELECT`部分应该只包含分组列或者这些聚合函数。如果你需要选择非聚合列,这些列必须在`...

    查看MySql数据表

    配合`GROUP BY`语句,可以按特定列对数据进行分组。 9. **索引**:了解数据表是否以及如何被索引也很关键,因为索引可以显著提高查询性能。你可以使用`SHOW INDEX FROM table_name;`来查看表的索引信息。 这些基本...

    mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示

    在上面的示例中,我们使用了 SUM 函数来计算每个 userid 对应的每个 subject 的分数,并使用 GROUP BY 语句来分组。 MySQL 列转行是将一列数据转换为多行数据的操作。例如,我们可以使用 UNION ALL 语句来将每个 ...

    MySQL无GROUP BY直接HAVING返回空的问题分析

    MySQL在使用HAVING子句时规定,HAVING必须配合GROUP BY子句使用,因此在没有GROUP BY子句的情况下使用HAVING子句是不符合SQL标准的。但MySQL为了灵活处理某些特殊场景,会自动将没有GROUP BY子句的SQL语句重写,增加...

    mysql case when group by 实例详解

    mysql 中类似php switch case 的语句。 select xx字段, case 字段 when 条件1 then 值1  when 条件2 then 值2 ...group by isCheck 使用case when : select sum(redpackmoney) as stota, (CASE i

    简单讲解sql语句中的group by的使用方法

    SQL中的`GROUP BY`语句是数据库查询中的一个重要部分,它用于将数据按照一个或多个列的值进行分组,以便对每个组执行聚合函数,如`SUM`、`COUNT`、`AVG`和`MAX`等。下面我们将详细讨论`GROUP BY`的使用方法及其相关...

    国家开放大学 MySQL数据库应用 实验训练2:数据查询操作

    本实验训练旨在让学生掌握 MySQL 数据库应用中的数据查询操作,包括字段查询、多条件查询、DISTINCT、ORDER BY、GROUP BY、聚合函数查询和连接查询等。 字段查询 在实验 2.1 中,我们学习了如何进行字段查询。例如...

    mysql中order by与group by的区别

    在MySQL数据库中,`ORDER BY` 和 `GROUP BY` 是两个非常重要的子句,它们各自在数据处理中扮演着不同的角色。理解它们的区别对于优化查询性能和获取所需数据至关重要。 `ORDER BY` 子句主要用于对查询结果进行排序...

    Mysql中order by、group by、having的区别深入分析

    在MySQL数据库中,ORDER BY、GROUP BY 和 HAVING 子句是SQL查询中用于数据处理的关键组成部分,它们各自承担不同的任务,以帮助我们从数据库中提取有用的信息。 ORDER BY 子句主要用于对查询结果集进行排序。当你...

Global site tag (gtag.js) - Google Analytics