zoukankan      html  css  js  c++  java
  • mysql 性能问题

    1、场景,模拟一天的数据,每个10秒,遍历1000个设备,每个设备模拟一个实时数据,总的数据量为:24*60*60/10*1000 = 864万条记录。
    2、采用策略,对时间分段,拼接sql语句查询,对于一个设备,查询一天每个小时的平均值,时间开销186.757秒。
    3、现在考虑简单的情况,求一个小时的平均值,sql语句如下:
    select '2015-06-16 00:00:00','2015-06-16 01:00:00', avg(`value`),unit from realdata_log where domainid='59133' and devicecode='10001' and (eventtime between '2015-06-16 00:00:00' and '2015-06-16 01:00:00'); 时间开销8秒
    4、这种性能太差,怎么解决?
    首先想到的是建立索引。对domainid+devicecode 建立索引,性能没有提高。再对eventtime建立索引,性能还是没有提高。
    5、上面是为什么呢?
    这是因为没有深入理解索引,记录本身没有顺序,索引相当于提取字段进行排序。比如:对domainid+devicecode 建立索引, 如下:
    create index realdata_dev_index using btree on realdata_log(domainid,devicecode); 就是按domainid+devicecode排序(实际上是先按domainid排序,再按devicecode排序),两个元素值定义了子节点的上限和下限,也就是框定了一组数据。比如查找domainid='1', devicecode='1256',从索引根节点开始,进入下一层,最后到叶子节点,很快把这一组数据都找到。如果没有索引,必须要遍历所有的记录。

    对domainid+devicecode 建立索引,为什么没有大幅度提高性能?
    虽然根据索引节点,可以找到一组记录,但是还要遍历检查记录的时间。怎么办?索引中增加一个字段eventtime,按domainid+devicecode+eventtime排序,如下:
    drop index realdata_dev_index on realdata_log;
    create index realdata_dev_time_index using btree on realdata_log(domainid,devicecode,eventtime);
    建立上面的索引,时间开销只有0.5秒,效率提高16倍。

    6、但是要查一天中每个小时的平均值,时间开销还是很大,0.5*24=12秒。也就是说,对于一个设备,查询一天中每个小时的平均值,也不能使用上面的策略。因此,需要新的策略,定时把平均值写入到一个新的表中。

  • 相关阅读:
    第一次上传文件到linux服务器
    @JsonFormat与@DateTimeFormat的区别
    Tomcat端口被占用处理
    简单的Tomcat部署
    PHP源码加密,zend guard与ioncube
    PHP计算年龄
    My97DatePicker时间控件 JQuery UI
    php二维数组自定义排序
    CodeSmith Generator 7.0.2激活步骤
    SQL Server Management Studio 2008版本的安装
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4604653.html
Copyright © 2011-2022 走看看