业务场景:两张表,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次方

最新文章

  1. 基础知识《十》unchecked异常和checked异常
  2. Rebuild Instance 操作详解 - 每天5分钟玩转 OpenStack(37)
  3. 使用Kettle抽取数据时,出现中文乱码问题解决方案
  4. 页面切换语言包使用session不用cookie
  5. Java虚拟机详解05----垃圾收集器及GC参数
  6. Bash脚本15分钟进阶教程
  7. Android组件的通讯——Intent
  8. HW6.12
  9. 第三篇、FMDB使用
  10. 【HDOJ】3308 LCIS
  11. java的OSGi确实是个坑
  12. Unity中AB资源打包简单的脚本
  13. Robot Framework - 2 - 创建测试库
  14. 使用mysqlproxy实现mysql读写分离
  15. pytorch学习资料链接
  16. oracle 判断字段相等,但类型不同引起的性能问题
  17. c++刷题(9/100):链表
  18. 学习网站总结-&gt;
  19. IIS部署网站常见问题
  20. hdu4307

热门文章

  1. VC++6.0环境中输出特殊字符
  2. Change myself to be better
  3. Executor ExecutorService Executors
  4. HTML——表格标签
  5. 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读
  6. Go 程序开发的注意事项
  7. ST表 (模板) 洛谷3865
  8. NX二次开发-UFUN圆弧矩阵标记、起始角和结束角(弧度测量)、圆弧中心坐标和圆弧半径UF_CURVE_ask_arc_data(边可以用)
  9. NX二次开发-更改图纸尺寸内容(编辑文本)uc5566
  10. three.js-走进3d的奇妙世界一创建一个三维场景