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中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中order by与group by的区别

     像sum()、count()、avg()等都是“聚合函数” 使用group by 的目的就是要将数据分类汇总。 您可能感兴趣的文章:sql中 order by 和 group by的区别深度分析mysql GROUP BY 与 ORDER BYgroup by,having,o

    通过联合索引优化MYSQL慢查询

    通过联合索引优化MYSQL慢查询 一、慢SQL分析 慢SQL如下 SELECT SUM(t.amount) as amount FROM (SELECT game_id,room_id,is_robot,amount,record_time FROM t_statements_logs WHERE game_id = 30 AND is_robot = 0 ...

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

    像sum()、count()、avg()等都是“聚合函数” 使用group by 的目的就是要将数据分类汇总。 一般如: select 单位名称,count(职工id),sum(职工工资) form [某表] group by 单位名称 这样的运行结果就是以“单位名称”...

    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

    简单介绍MySQL中GROUP BY子句的使用

    可以使用GROUP BY组值一列,并且如果愿意的话,可以将该列进行计算。使用COUNT,SUM,AVG等功能的分组列。 要了解GROUP BY子句考虑的EMPLOYEE_TBL的的表具有以下记录: mysql> SELECT * FROM employee_tbl; +------...

    MYSQL中有关SUM字段按条件统计使用IF函数(case)问题

    今天群里有人问了个问题是这样的: 然后有群友是这样回答的 代码如下: select name,sum(case when stype=4 then money*(-1) else money end ) as M from table group by name 我想了想,应该可以用IF函数 于是改了下...

    MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句

    select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),’ MB’) as data_size,concat(truncate(sum(index_length)/1024/1024,2),’MB’) as index_sizefrom information_schema.tablesgroup by ...

    MySQL数据库:分类汇总.pptx

    数据查询;;分类汇总;【例】 输出Book表中图书类别名。 SELECT 图书类别 FROM Book GROUP BY 图书类别; 【例】 按图书类别统计Book表中各类图书的库存数。 SELECT 图书类别,COUNT(*) AS '库存数' FROM Book GROUP BY ...

    mysql数据库应用形考任务(实训1~4.zip)

    熟悉MySQL环境的使用,掌握在MySQL中创建数据库和表的方法,理解MySQL支持的数据类型、数据完整性在MySQL下的表现形式,练习MySQL数据库服务器的使用,练习CREATE TABLE,SHOW TABLES,DESCRIBE TABLE,ALTER TABLE...

    数据库MySQL基础知识点3

     group by + having:【注】having只能用于group by。而where是用来过滤表数据的  group by + with rollup:分组+小计 限制记录limit:限制取出记录的数量,要写在SQL语句的最后 标准的SQL书写格式

    Mysql数据库设计.pdf

    select group by having order by limit desc asc count sum avg max min resource mysql_connect(host,root,password); mysql_close(); bool mysql_select_db(tablename[,],连接返回变量); resource mysql_query...

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

    有一张表,id是主键,这样的写法可以返回一条记录: 代码如下:“SELECT * FROM t HAVING id=MIN(id);”但是只是把MIN换成MAX,这样返回就是空了: 代码如下:“SELECT * FROM t HAVING id=MAX(id);...

    MySQL命令大全

    mysql> select * from MyClass order by id limit 0,2; 或者: mysql> select * from MyClass limit 0,2; 6、删除表中数据 命令:delete from 表名 where 表达式 例如:删除表 MyClass中编号为 的记录 mysql>...

    mysql查询必练50题

    GROUP BY sid HAVING 平均成绩 > 60; SELECT sid, AVG(score) FROM sc GROUP BY sid HAVING AVG(score)>60; -- 3、查询所有同学的学号、姓名、选课数、总成绩; SELECT s.sid 学号, s.sname 姓名, COUNT(*) 选...

    对MySQL子查询的简单改写优化

    使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有...

    case when和sum case when 写法及拼接字段

    1 case when 写法 2 sum case when 用法 3 select 拼接字段 示例如下: when 2 then 'C' else 'D' end ) as '类型',count(*) as '数量' from table group by orderType

    mysql基本语法,增删改查大全总结,以及常用的sql语句总结

    mysql语法大全总结,内含DDL,DML,DQL,DCL等语句,可作为工作学习的小字典,随时查看学习,查询所有数据库、查询当前数据库、创建数据库、删除数据库、切换数据库、查询当前数据库的所有表、查看指定表结构、查询指定...

    开源MySQL高效数据仓库解决方案:Infobright详细介绍

    Infobright是开源的MySQL数据仓库解决方案,引入了列存储方案,高强度的数据压缩,优化的统计计算(类似sum/avg/group by之类),infobright 是基于mysql的,但不装mysql亦可,因为它本身就自带了一个。mysql可以粗...

    MySQL查询语句常见操作语句格式代码.docx

    mysql查询语句汇总 MySQL作为流行的关系型数据库管理系统,其查询语句的灵活性和强大性是它深受欢迎的原因之一。下面,我们将进一步探讨MySQL查询语句的不同方面,从基础查询到高级查询,以...结合GROUP BY子句,可以

Global site tag (gtag.js) - Google Analytics