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秒。也就是说,对于一个设备,查询一天中每个小时的平均值,也不能使用上面的策略。因此,需要新的策略,定时把平均值写入到一个新的表中。

  • 相关阅读:
    centos 安装docker
    vsphere client 创建虚拟机 如何关联到本地iso文件
    在centos7中使用supermin制作centos6.5docker镜像
    centos安装后,连接不上网络,yum命令执行can not find a valid baseurl for repo: base/7/x86-64
    佛祖保佑,永无BUG
    框架原理
    android 中解析XML的方法(转)
    android 项目随记一
    android事件系列-onTouch事件与手势操作
    深入理解 AngularJS 的 Scope(转)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4604653.html
Copyright © 2011-2022 走看看