-
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个答案 按时间排序 按投票排序
-
那个in可以去掉,可以在后面用and进行拼接 然后group by你看能用什么办法代替掉不
如果用其他写法代替之后还是不行,建议给列添加索引
另外,函数尽量少用,我上次用substring在sql里面写的时候只要0.2秒,但是部署到虚拟机上要跑1分钟2016年3月24日 20:44
-
如果是固定的几个数据,in的效率和exists效率一样
如果in和exists后面用到了子查询,子查询的数据量比较大,exists比in高,数据量小,in效率比exists高2015年1月28日 11:06
-
使用 exists试试看
我记得 exists 在一定条件下的效率要高上不少
刚刚找了找参考资料:
[url=http://blog.sina.com.cn/s/blog_63a48d250100sni4.html]in and exists效率问题
[/url]2015年1月23日 14:52
-
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
-
最好查询计划贴出来。
另外,联合索引做的顺序是什么?
先ObserveTime然后StationID吗?
这样的话,直接用StationID去分组是用不到索引的。
试试看分2个索引建立。2015年1月13日 18:27
-
可以确认3个地方
1. oerder by "null" ?? 如果没有排序最好去掉,如果有排序,确认排序字段是否有索引
2. 如果可能,把in的方式改为 ObserveTime = xx and ObserveTime = yy ...
3. 适当的索引2015年1月13日 18:20
相关推荐
mysql 中order by 与group by的顺序是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group ...
像sum()、count()、avg()等都是“聚合函数” 使用group by 的目的就是要将数据分类汇总。 您可能感兴趣的文章:sql中 order by 和 group by的区别深度分析mysql GROUP BY 与 ORDER BYgroup by,having,o
通过联合索引优化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 ...
像sum()、count()、avg()等都是“聚合函数” 使用group by 的目的就是要将数据分类汇总。 一般如: select 单位名称,count(职工id),sum(职工工资) form [某表] 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
可以使用GROUP BY组值一列,并且如果愿意的话,可以将该列进行计算。使用COUNT,SUM,AVG等功能的分组列。 要了解GROUP BY子句考虑的EMPLOYEE_TBL的的表具有以下记录: mysql> SELECT * FROM employee_tbl; +------...
今天群里有人问了个问题是这样的: 然后有群友是这样回答的 代码如下: select name,sum(case when stype=4 then money*(-1) else money end ) as M from table group by name 我想了想,应该可以用IF函数 于是改了下...
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 ...
数据查询;;分类汇总;【例】 输出Book表中图书类别名。 SELECT 图书类别 FROM Book GROUP BY 图书类别; 【例】 按图书类别统计Book表中各类图书的库存数。 SELECT 图书类别,COUNT(*) AS '库存数' FROM Book GROUP BY ...
熟悉MySQL环境的使用,掌握在MySQL中创建数据库和表的方法,理解MySQL支持的数据类型、数据完整性在MySQL下的表现形式,练习MySQL数据库服务器的使用,练习CREATE TABLE,SHOW TABLES,DESCRIBE TABLE,ALTER TABLE...
group by + having:【注】having只能用于group by。而where是用来过滤表数据的 group by + with rollup:分组+小计 限制记录limit:限制取出记录的数量,要写在SQL语句的最后 标准的SQL书写格式
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...
有一张表,id是主键,这样的写法可以返回一条记录: 代码如下:“SELECT * FROM t HAVING id=MIN(id);”但是只是把MIN换成MAX,这样返回就是空了: 代码如下:“SELECT * FROM t HAVING id=MAX(id);...
mysql> select * from MyClass order by id limit 0,2; 或者: mysql> select * from MyClass limit 0,2; 6、删除表中数据 命令:delete from 表名 where 表达式 例如:删除表 MyClass中编号为 的记录 mysql>...
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(*) 选...
使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有...
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语法大全总结,内含DDL,DML,DQL,DCL等语句,可作为工作学习的小字典,随时查看学习,查询所有数据库、查询当前数据库、创建数据库、删除数据库、切换数据库、查询当前数据库的所有表、查看指定表结构、查询指定...
Infobright是开源的MySQL数据仓库解决方案,引入了列存储方案,高强度的数据压缩,优化的统计计算(类似sum/avg/group by之类),infobright 是基于mysql的,但不装mysql亦可,因为它本身就自带了一个。mysql可以粗...
mysql查询语句汇总 MySQL作为流行的关系型数据库管理系统,其查询语句的灵活性和强大性是它深受欢迎的原因之一。下面,我们将进一步探讨MySQL查询语句的不同方面,从基础查询到高级查询,以...结合GROUP BY子句,可以