2019独角兽企业重金招聘Python工程师标准>>>

一,拆分表

服务器告警,逻辑服务器告警的数据与终端告警的数据之间业务上没有关联,分成两个表后可以减少表大小,而且有利于查询。

mysql> select count(*) from warning_repaired;
+----------+
| count(*) |
+----------+
|   879340 |
+----------+
1 row in set (0.24 sec)mysql> select count(*) from warning_repaired where warning_type!=2;
+----------+
| count(*) |
+----------+
|   868806 |
+----------+
1 row in set (0.57 sec)
mysql> SELECT count(*) FROM warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/12/29 00:00:00' AND '2016/01/12 00:00:59';
+----------+
| count(*) |
+----------+
|    89668 |
+----------+
1 row in set (0.17 sec)SELECT count(*) FROM warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/12/29 00:00:00' AND '2016/01/12 00:00:59' &&  warning_type!=2;
+----------+
| count(*) |
+----------+
|    89655 |
+----------+
1 row in set (0.95 sec)

可以看出由于添加了warning_type!=2的条件选择后,查询时间比不加此条件的查询时间多了很多。

mysql> explain SELECT count(*) FROM warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/12/29 00:00:00' AND '2016/01/12 00:00:59';
+----+-------------+------------------+-------+------------------------+-------------------+---------+------+--------+--------------------------+
| id | select_type | table            | type  | possible_keys          | key               | key_len | ref  | rows   | Extra                    |
+----+-------------+------------------+-------+------------------------+-------------------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | warning_repaired | range | time_domain_level,time | time_domain_level | 165     | NULL | 349356 | Using where; Using index |
+----+-------------+------------------+-------+------------------------+-------------------+---------+------+--------+--------------------------+
1 row in set (0.00 sec)mysql> explain SELECT count(*) FROM warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/12/29 00:00:00' AND '2016/01/12 00:00:59' &&  warning_type!=2;
+----+-------------+------------------+------+------------------------+------+---------+------+--------+-------------+
| id | select_type | table            | type | possible_keys          | key  | key_len | ref  | rows   | Extra       |
+----+-------------+------------------+------+------------------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | warning_repaired | ALL  | time_domain_level,time | NULL | NULL    | NULL | 794624 | Using where |
+----+-------------+------------------+------+------------------------+------+---------+------+--------+-------------+
1 row in set (0.00 sec)

通过explain的信息看出在增加了warning_type!=2的条件后,导致索引无法使用。

如果索引不能使用,会导致单表数据量大时,查询速度变慢。


拆分后的好处:

1.由一个表拆分成两个表后,相对每个表的数据量减少了。

2.减少查询条件的判断,能够有效使用索引,提高了查询效率。


二,优化表的数据类型

    原来的warning_repaired 表:

 warning_repaired | CREATE TABLE `warning_repaired` (`id` int(11) NOT NULL AUTO_INCREMENT,`device_moid` varchar(36) NOT NULL,`device_name` varchar(128) DEFAULT NULL,`device_type` varchar(36) DEFAULT NULL,`device_ip` varchar(128) DEFAULT NULL,`warning_type` enum('0','1','2') NOT NULL,`domain_moid` varchar(36) NOT NULL,`domain_name` varchar(128) DEFAULT NULL,`code` smallint(6) NOT NULL,`level` varchar(16) NOT NULL,`description` varchar(128) DEFAULT NULL,`start_time` datetime NOT NULL,`resolve_time` datetime NOT NULL,PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1758514 DEFAULT CHARSET=utf8

改为:

terminal_warning_repaired

 CREATE TABLE `terminal_warning_repaired` (`id` int(11) NOT NULL AUTO_INCREMENT,`device_moid` varchar(36) NOT NULL,`device_name` varchar(128) DEFAULT NULL,`device_type` varchar(36) DEFAULT NULL,`device_ip` varchar(128) DEFAULT NULL,`domain_moid` varchar(36) NOT NULL,`domain_name` varchar(128) DEFAULT NULL,`code` smallint(6) NOT NULL,`level` enum('critical','important','normal') NOT NULL,`description` varchar(128) DEFAULT NULL,`start_time` datetime NOT NULL,`resolve_time` datetime NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

server_warning_repaired

CREATE TABLE `server_warning_repaired` (`id` int(11) NOT NULL AUTO_INCREMENT,`device_moid` varchar(36) NOT NULL,`device_name` varchar(128) DEFAULT NULL,`device_type` varchar(36) DEFAULT NULL,`device_ip` varchar(128) DEFAULT NULL,`domain_moid` varchar(36) NOT NULL,`domain_name` varchar(128) DEFAULT NULL,`code` smallint(6) NOT NULL,`level` enum('critical','important','normal') NOT NULL,`description` varchar(128) DEFAULT NULL,`start_time` datetime NOT NULL,`resolve_time` datetime NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

把warning_repaired表拆分terminal_warning_repaired和server_warning_repaired表,去掉了warning_type字段,把level字段的类型改为`level` enum('critical','important','normal') NOT NULL

同样warning_unreparied表也是按照此方法拆分,(warning_unrepaired表数据量还不是很大)。

warning_unrepaired表拆分为:server_warning_unrepaired和terminal_warning_unrepaired

server_warning_unrepaired的创建如下:

 CREATE TABLE `server_warning_unrepaired` (`id` int(11) NOT NULL AUTO_INCREMENT,`device_moid` varchar(36) NOT NULL,`device_name` varchar(128) DEFAULT NULL,`device_type` varchar(36) DEFAULT NULL,`device_ip` varchar(128) DEFAULT NULL,`domain_moid` varchar(36) NOT NULL,`domain_name` varchar(128) DEFAULT NULL,`code` smallint(6) NOT NULL,`level` enum('critical','important','normal') NOT NULL,`description` varchar(128) DEFAULT NULL,`start_time` datetime NOT NULL,`resolve_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

terminal_warning_unrepaired的创建如下:

 CREATE TABLE `terminal_warning_unrepaired` (`id` int(11) NOT NULL AUTO_INCREMENT,`device_moid` varchar(36) NOT NULL,`device_name` varchar(128) DEFAULT NULL,`device_type` varchar(36) DEFAULT NULL,`device_ip` varchar(128) DEFAULT NULL,`domain_moid` varchar(36) NOT NULL,`domain_name` varchar(128) DEFAULT NULL,`code` smallint(6) NOT NULL,`level` enum('critical','important','normal') NOT NULL,`description` varchar(128) DEFAULT NULL,`start_time` datetime NOT NULL,`resolve_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

导入测试数据

导入终端已修复告警数据

mysql> select count(*) from warning_repaired;
+----------+
| count(*) |
+----------+
|   879340 |
+----------+
1 row in set (0.38 sec)mysql> insert into terminal_warning_repaired(device_moid, device_name, device_type, device_ip, ->  domain_moid, domain_name, code, level, description, start_time, resolve_time) -> select device_moid, device_name, device_type, device_ip, domain_moid, -> domain_name, code, level, description, start_time, resolve_time from warning_repairedwhere warning_type="2";
Query OK, 10534 rows affected (7.82 sec)
Records: 10534  Duplicates: 0  Warnings: 0mysql> select count(*) from terminal_warning_repaired;
+----------+
| count(*) |
+----------+
|    10534 |
+----------+
1 row in set (0.00 sec)

可以看出终端告警的数量还是相对比较少的

导入‍服务器已修复告警数据:

mysql> insert into server_warning_repaired(device_moid, device_name, device_type, device_ip, ->  domain_moid, domain_name, code, level, description, start_time, resolve_time) -> select device_moid, device_name, device_type, device_ip, domain_moid, -> domain_name, code, level, description, start_time, resolve_time from warning_repaired where warning_type!="2";
Query OK, 868806 rows affected (31.88 sec)
Records: 868806  Duplicates: 0  Warnings: 0

可以看出服务器告警相对来说还是比较多的。


查询优化测试

1.根据查询条件创建索引:

mysql> create index time_domain_level_type
on server_warning_repaired(start_time, domain_moid, level, device_type);
Query OK, 0 rows affected (12.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show index from server_warning_repaired;
+-------------------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                   | Non_unique | Key_name               | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| server_warning_repaired |          0 | PRIMARY                |            1 | id          | A         |      859791 |     NULL | NULL   |      | BTREE      |         |               |
| server_warning_repaired |          1 | time_domain_level_type |            1 | start_time  | A         |      859791 |     NULL | NULL   |      | BTREE      |         |               |
| server_warning_repaired |          1 | time_domain_level_type |            2 | domain_moid | A         |      859791 |     NULL | NULL   |      | BTREE      |         |               |
| server_warning_repaired |          1 | time_domain_level_type |            3 | level       | A         |      859791 |     NULL | NULL   |      | BTREE      |         |               |
| server_warning_repaired |          1 | time_domain_level_type |            4 | device_type | A         |      859791 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------------------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)

2. 测试查询时间:

mysql> SELECT count(*) FROM server_warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/12/29 00:00:00' AND '2016/01/12 00:00:59';
+----------+
| count(*) |
+----------+
|    89655 |
+----------+
1 row in set (0.17 sec)mysql> SELECT count(*) FROM server_warning_repaired WHERE
level IN ('important','critical') && domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/10/29 00:00:00' AND '2016/01/12 00:00:59';
+----------+
| count(*) |
+----------+
|   408142 |
+----------+
1 row in set (0.77 sec)

可以看出查询时间还是比较少的。

3. 把数据量增加一倍

mysql> select count(*) from server_warning_repaired;
+----------+
| count(*) |
+----------+
|  1737612 |
+----------+
1 row in set (1.09 sec)mysql> SELECT count(*) FROM server_warning_repaired WHERE level IN ('important','critical')&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6' && start_time  BETWEEN '2015/01/29 00:00:00' AND '2016/01/12 00:00:59';
+----------+
| count(*) |
+----------+
|   816284 |
+----------+
1 row in set (2.11 sec)mysql> explain SELECT count(*) FROM server_warning_repaired WHERE level IN ('important','critical')&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6' && start_time  BETWEEN '2015/01/29 00:00:00' AND '2016/01/12 00:00:59';
+----+-------------+-------------------------+-------+------------------------+------------------------+---------+------+--------+--------------------------+
| id | select_type | table                   | type  | possible_keys          | key                    | key_len | ref  | rows   | Extra                    |
+----+-------------+-------------------------+-------+------------------------+------------------------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | server_warning_repaired | range | time_domain_level_type | time_domain_level_type | 116     | NULL | 828802 | Using where; Using index |
+----+-------------+-------------------------+-------+------------------------+------------------------+---------+------+--------+--------------------------+
1 row in set (0.00 sec)

可以看出时间增加的速度还是比较快的。

不过有一点可以看出,上面的数据比较多的816284,也就是mysql查询出来结果扫描的行数也是比较多的

而我们只所以加索引去优化查询速度的目的就是要查询快,

怎么才能查询快呢?

避免让查询时扫描行数比较多

********************************************************************************

来看看下面查询花费的时间:

mysql> SELECT count(*) FROM server_warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/10/29 00:00:00' AND '2016/01/12 00:00:59';
+----------+
| count(*) |
+----------+
|   816284 |
+----------+
1 row in set (2.00 sec)mysql> SELECT count(*) FROM server_warning_repaired WHERE level IN ('important','critical')
&& domain_moid = '05b70143-eea3-4a4d-8038-1920623f5ff6'
&& start_time  BETWEEN '2015/12/29 00:00:00' AND '2016/01/12 00:00:59';
+----------+
| count(*) |
+----------+
|   179310 |
+----------+
1 row in set (0.33 sec)mysql>

花费的时间瞬间减少了一个数量级。

上面的查询条件不一样,第一查询的时间是大概三个月的,一个查询的时间是一个月的(数据是伪造的不一定符合真实情况)。所以我们在前端进行搜索时,尽量避免导致全表扫描的搜索条件,需要对搜素条件进行一些合理的限制。

遗留问题:

一张数据表最大多少数据量的时候,需要对其进行转储?

转载于:https://my.oschina.net/lvhuizhenblog/blog/634409

为什么要拆分warning_repaired表?相关推荐

  1. python按某列拆分excel表格_python带格式拆分excel表单,copy库完美搞定

    python拆分excel表单,生成单独的excel文件,网上这方面的文章很多.但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲.本文通过调用copy库,完美实现带格式拆分表单 ...

  2. Excel·VBA按行拆分工作表

    对应之前文章<Excel·VBA按列拆分工作表>,对Excel表格数据按照固定行数,将工作表拆分 工作表按行拆分为工作表 Sub 工作表按行拆分为工作表()'当前工作表(worksheet ...

  3. 超简单的方法完整保留原有所有样式拆分Excel表

    本文作为一篇原始雏形已经过时,新版本的文章请移步到: 深度剖析Excel表拆分的三项技术(已实现纯Openpyxl保留全部样式拆分,自适应单文件和多文件拆分等):https://blog.csdn.n ...

  4. PostgreSQL 用 CTE语法 + 继承 实现平滑拆分大表

    标签 PostgreSQL , 拆分大表 , 继承 , cte 背景 业务设计初期可能不会考虑到表将来会有多大,或者由于数据日积月累,单表会变得越来越大. 后面在考虑分区的话,应该怎么将单表切换成分区 ...

  5. 利用慧办公拆分工作表教程

    有时我们想根根据某一列拆分工作表,利用软件可以进行批量操作,提高效率. 首先需要安装慧办公.安装成功之后打开excel会显示在菜单栏中如下图 下面利用慧办公拆分表被拆分后的表如下显示,多个工作表就是被 ...

  6. excel快速拆分工作表

    今天跟大家分享一下excel快速拆分工作表 1.打开演示文件,要求将表格拆分开. 2.点击下图选项 3.点击[汇总拆分]-[拆分工作表] 4.将[表头行数]设置为4 5.最后点击[确定]即可完成 6. ...

  7. 个人永久性免费-Excel催化剂功能第23波-非同一般地批量拆分工作表

    工作薄的合并,许多Excel插件已有提供,Excel催化剂也提供了最佳的解决方案,另外还有工作薄的拆分和工作表的拆分,同样也是各大插件必备功能. 至于工作薄拆分,那是伪需求,Excel催化剂永远只会带 ...

  8. ①隔若干行插入分页符②排签排版③按条件分页④按行拆分工作表

    ​​​​​​关于打印与分页的4个高级技巧 ①隔若干行插入分页符,相当于按规律手动分页 ②排签排版,相当于分栏打印 ③按条件分页,使一页中只支持一个类别的数据 ④按行数拆分工作表,从而使用每页都能打印顶 ...

  9. 工作表拆分成分表的2种情况及处理方式

    在日常经营统计分析工作中,常常需要进行报表的拆分,主要拆分的情形有2种: 1.将某工作簿中的所有工作表拆分后,分表独立保存到该工作簿所在的文件夹中 2.按照一定的业务条件(如日期.地区.渠道等),从总 ...

最新文章

  1. python 基础命令-Python 命令行(CLI)基础库
  2. QT的QWinTaskbarButton类的使用
  3. win上mysql忘记root密码_MySQL数据库之windows下mysql忘记root密码的解决方法
  4. 外网数据同步到内网方案_数据同步之解决方案
  5. java uuid静态方法_Java UUID toString()方法与示例
  6. 中国连续十年成马来西亚最大贸易伙伴
  7. 亚马逊员工因龙卷风身亡 贝索斯庆祝载人飞行惹众怒
  8. 弹性计算 Region 化部署和跨可用区容灾介绍
  9. java 双向链表循环_(java实现)双向循环链表
  10. 闪电模型数学_【雷电流的数学模型仿真分析】 matlab数学模型仿真系统图
  11. 国家图书馆最新推荐70本书
  12. 华为服务器插键盘的位置,服务器如何调出软键盘
  13. 大白菜装机教程win10_电脑一键装机win10系统_win10教程
  14. Three.js 开启带动画模型的动画
  15. 权限系统就该这么设计(万能通用),稳的一批!
  16. JavaWeb之页面跳转数据库连接
  17. JAVA高级---(2)15分钟入门JVM底层原理
  18. 大学生如何学习Java
  19. 【洛谷题解】P2404 自然数的拆分问题
  20. 嘉立创电路板制作过程全流程详解(五):测试、锣边、V-CUT、QC、发货

热门文章

  1. 安装包没有证书怎么强行安装_该安装包未包含任何证书
  2. github ssh 配置_怎么给Git配置多个SSH Key?
  3. python从大到小排序_python作业:用嵌套的列表存储学生成绩数据,并编程完成如下操作...
  4. C++socket编程(六):6.4 epoll多路复用IO高并发
  5. 单片机的最新发展动态_【计算机论文】单片机在节能、语言交流和智能监控上的应用...
  6. php 微信获取code,微信网页授权接口为什么获取不到code(已解决)
  7. matlab 拼接矩阵,Matlab 不同行数矩阵拼接
  8. virtual box linux 安装增强功能,Linux 开发环境中为VirtualBox安装增强功能
  9. MySQl Modify JSON Values
  10. TensorFlow Seq2Seq