业务场景:两张表,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转数字作比较的一次优化的更多相关文章

  1. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  2. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  3. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  4. Python开发【第十九篇】:Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  5. 【Python之路】第十九篇--Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  6. 十九、MySQL GROUP BY 语句

    MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT ...

  7. 【Python之路】第十八篇--MySQL(一)

    一.概述 1.什么是数据库 ? 答:数据的仓库. 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一个软件,都有两个主要的功能: a. ...

  8. 第十九篇 -- QTableWidget的使用

    QTableWidget的一些常用方法 下面两个类可以根据自己的情况自定义. 单元格类型的类: class CellType(Enum): ctKey = 1000 ctPath = 1001 ctI ...

  9. java web学习总结(二十九) -------------------JavaBean的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

随机推荐

  1. URLSearchParams接口用来处理浏览器的url

    URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串. URLSearchParams.append()插入一个指定的键/值对作为新的搜索参数. URLSearchPa ...

  2. bootstrap 基础模板相关信息

    <!DOCTYPE html> <html> <head> <title></title> <link rel="style ...

  3. jQuery - DOM相关

    1. 操作文本 console.log($("#t1").html()); // 获取span元素中的内容, 包含html标签 $("#t1").html(&q ...

  4. 关于使用vue时的个人规范

    js文件: 公共功能文件:common_功能名.js 例:common_ajax.js 页面级功能文件(在不同页面复用):page_功能名.js 放置在html文件中加载的js文件命名:app_htm ...

  5. Nginx的静态代理

    Nginx的静态代理 Nginx的web请求的处理机制 Nginx结合多进程和异步机制对外提供服务,异步机制使用的是异步非阻塞机制,即AIO,Nginx的master进程会生成多个worker进程,m ...

  6. Go 程序开发的注意事项

    Go 程序开发的注意事项    1) Go 源文件以 "go" 为扩展名.    2) Go 应用程序的执行入口是 main()函数. 这个是和其它编程语言(比如 java/c)  ...

  7. NX二次开发-遍历当前part所有component,把装配子部件设置成工作部件

    NX11+VS2013 #include <uf.h> #include <uf_disp.h> #include <uf_modl.h> #include < ...

  8. JVM常用命令行工具1

    1.jps [options][hostid]:查看虚拟机进程状况 -l 输出主类全名,如果进程执行的是jar包,输出jar包路径.-q 只输出LVMID. -m输出虚拟机进程启动时传递给主类main ...

  9. socket的多线程实现

    步骤: 1.服务端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建socket并请求与服务端对话: 3.服务端接收客户端的请求,创建socket与客户端进行专线连 ...

  10. 6-Python操作MySQL-增(insert)-删(delete)-改(update)-查(select)

    增删改 from pymysql import * def main(): # 创建Connection连接 conn = connect(host='localhost',port=3306,dat ...