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语句与update语句的用法研究.pdf

    MySQL 数据库中 group by 语句与 update 语句的用法研究 本论文对 MySQL 数据库中的 group by 语句和 update 语句进行了深入研究,讨论了这些语句在数据库查询和修改中的应用,并给出了具体的解决方案。 一、MySQL...

    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中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