第十九篇:Mysql两次Group by和ip转数字作比较的一次优化
业务场景:两张表,ipconfig_group表存了单位和 ip 起始段信息
visit_info表存储了访问次数,失败次数,访问流量,用户ip等信息
两张表的关系为:
一个部门下有若干ip段,对应的下面表的visitorip,每个visitorip有访问次数,失败次数,流量
现在,要按部门统计各部门的访问次数,失败次数,流量
通常的做法:
第一步:统计visit_info 表各个ip的次数
第二步:统计这些ip对应哪个部门,相同部门的对应字段叠加
常规方法:如果先搞定第一步,然后程序处理第二步,那么就需要用java模拟数据库查询的Group by
方法如下:
这里是只统计了流量,因为是已经做好的一个需求的逻辑,用java程序处理比较好理解
现在要统计3个字段累加,那么就只能定义一个Map<String,List<Integer>>,先遍历第一步返回的结果list
String是部门作为键,List<Integer>是后3个字段,放在一个List<Map<String,List<Integer>>>中
也可以用Map<String,Integer>存,放在List<Map<String,Map<String,Integer>>>,然后遍历最外层的list
像上图加红字标注的地方,那是一个简单的Integer相加,这里因为有3个要累加,
所以要写一个实现相同键(部门)对应的值(List<Integer>或Map<String,Integer>)累加的方法,怎么叠加很简单就不说了
可以想见,写起来非常麻烦,这就是java代替数据库Group by的方法逻辑吧
优化如下:首先肯定需要组合查询,第一步还是查一张表统计ip:
结果如下
第二步:组合查询,查询ip在符合的ip段内的部门统计结果
这里先要用到一个函数:inet_aton(ip),这个函数可以将任意一个标准的ip值:XXX.XXX.XXX.XXX转换成整数int型(最多10位)
好了所有的路铺平了,只差复合sql查出来就行了:
所有的逻辑,在数据库层面做完,程序再也不用那么麻烦,代码简化一大截
看,现在就一句代码了^^^^^^^^
性能的问题,暂时没考虑,因为截图测试的数据量很少,
但是如果是程序自己实现Group by,只是分步骤,数据库查询sql简单了,但是次数就非常多了,总的时间并不见得会短
这里有几个关键:
1、Group by用java程序实现,虽然是笨了点,但是也为以后做统计给了一种思路
2、ip段作比较用了mysql的inet_aton函数,事实上一开始我没想到有这个函数,实在是程序实现统计的逻辑太烦想图简单才去查阅
这也给了我们一个思路,上面截图最大的ip也才是10位的整型。mysql还有一个inet_ntoa函数用来将数字转为IP值
数据库优化原则:字段类型定义使用最合适(最小),最简单的数据类型
那么我们存进去的时候就可以考虑存为整型,取出来的时候用inet_ntoa()转为ip
附:a.b.c.d 的ip number是:
a * 2的11次方 + b * 2的10次方 + c * 2的8次方 + d * 2的0次方
第十九篇:Mysql两次Group by和ip转数字作比较的一次优化的更多相关文章
- Python之路【第十九篇】:爬虫
Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...
- Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)
第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
- Python开发【第十九篇】:Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- 【Python之路】第十九篇--Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- 十九、MySQL GROUP BY 语句
MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT ...
- 【Python之路】第十八篇--MySQL(一)
一.概述 1.什么是数据库 ? 答:数据的仓库. 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一个软件,都有两个主要的功能: a. ...
- 第十九篇 -- QTableWidget的使用
QTableWidget的一些常用方法 下面两个类可以根据自己的情况自定义. 单元格类型的类: class CellType(Enum): ctKey = 1000 ctPath = 1001 ctI ...
- java web学习总结(二十九) -------------------JavaBean的两种开发模式
SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...
随机推荐
- 线程池 一 ThreadPoolExecutor
java.util.concurrent public class ThreadPoolExecutor extends AbstractExecutorService ThreadPoolExecu ...
- CF838C(博弈+FWT子集卷积+多项式ln、exp)
传送门: http://codeforces.com/problemset/problem/838/C 题解: 如果一个字符串的排列数是偶数,则先手必胜,因为如果下一层有后手必赢态,直接转移过去,不然 ...
- DELPHI 数据库操作
DELPHI 把数据库中的数据转换成XML格式 function ReplaceString(AString: string): string; begin Result := StringRepla ...
- NX二次开发-UFUN将建模绝对空间中的点映射到工程图坐标UF_VIEW_map_model_to_drawing
#include <uf.h> #include <uf_ui.h> #include <uf_draw.h> #include <uf_view.h> ...
- hdu多校第六场1012 (hdu6645) Stay Real 假博弈,真贪心
题意: 给你一个小根堆,从根开始拿,拿走子节点被拿完后才可以拿走父节点,两个人依次拿,谁拿的节点总和大谁获胜,问你谁有必胜策略. 题解: 小根堆中,每个点的权值总是不小于父亲节点的权值.所以无论怎么取 ...
- 【开篇】基于C#+EmguCV的机器视觉平台开发
市面上关于通用的机器视觉平台已有不少,一些大的视觉产品.设备制造商都有开发自己的一套系统.其通用性也都有一些行业局限,难以囊括所有可能性,一些需要经过二次开发,这也是难以攻克的问题.本人水平有限,再加 ...
- getmapping等无法解析
版本要改一下,4.1.6没有<dependency> <groupId>org.springframework</groupId> <artifactId&g ...
- 阿里云ecs(phpstudy一件包)
选择语言 保存并连接 Linux硬盘挂载是比较常见的管理操作之一.默认情况下数据盘没有挂载,需要手动挂载到系统中. 具体操作是分三步: 硬盘挂载1)需 ...
- Eclipse代替Oracle接管Java EE
Eclipse Foundation接替Oracle成为Java EE的新东家,Oracle不再管理Java EE. 作为采用的一部分,Java EE可能会更换新名称,Oracle建议在其建议中使用J ...
- Spring源码分析(一):从哪里开始看spring源码(系列文章基于Spring5.0)
概述 对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core, ...