经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » SQL语言 » 查看文章
记录工作过程中一次业务优化
来源:cnblogs  作者:小吴的成长之路  时间:2024/3/20 9:11:41  对本文有异议

1需求

用户需要输入身份证和姓名进行登录,登录时需要判断是否存在在数据库存在,登录成功后需要记录登录的信息以及微信Id,如果用到不同的微信账号,需要记录多次记录。

2设计

2.1数据库设计

img

  1. CREATE TABLE `ExamDefine` (
  2. `Id` varchar(36) NOT NULL COMMENT '主键编码',
  3. `ExamName` varchar(100) NOT NULL COMMENT '任务名称',
  4. PRIMARY KEY (`Id`)
  5. );
  6. CREATE TABLE `ExamStu` (
  7. `Id` varchar(36) NOT NULL COMMENT '主键编码',
  8. `ExamDefineId` varchar(36) NOT NULL COMMENT '任务编码',
  9. `StuName` varchar(100) NOT NULL COMMENT '考生姓名',
  10. `CertificateType` int NOT NULL COMMENT '证件类型',
  11. `IdentificationID` varchar(50) NOT NULL COMMENT '证件号码',
  12. PRIMARY KEY (`Id`)
  13. );
  14. CREATE TABLE `StuLogin` (
  15. `Id` varchar(36) NOT NULL COMMENT '主键编码',
  16. `StuName` varchar(100) NOT NULL COMMENT '考生姓名',
  17. `IdentificationID` varchar(50) NOT NULL COMMENT '证件号码',
  18. `LoginTime` datetime NOT NULL COMMENT '登录时间',
  19. `wxId` varchar(100) NOT NULL COMMENT '微信Id',
  20. PRIMARY KEY (`Id`)
  21. );
  22. ALTER TABLE `ExamStu` ADD CONSTRAINT `ExamDefineId` FOREIGN KEY (`ExamDefineId`) REFERENCES `ExamDefine` (`Id`);

2.2业务流程

img

2.3业务统计需求

1.统计任务考生人数,已登录人数,未登录人数,多账号登录人数
2.按照曲线方式统计每天登录人数、累计登录人数

2.3.1Sql语句

  • 统计任务考生人数,已登录人数,未登录人数,多账号登录人数
  1. SELECT
  2. count( 1 ) StuCount,
  3. Sum( LoginCount > 0 ) LoginCount,
  4. Sum( LoginCount > 1 ) MultipleLogins
  5. FROM
  6. ExamStu
  7. LEFT JOIN ( SELECT IdentificationID, count( 1 ) LoginCount FROM StuLogin GROUP BY IdentificationID ) lg ON ExamStu.IdentificationID = lg.IdentificationID
  8. WHERE
  9. ExamDefineId = @ExamDefineId

ExamStu表120w记录,StuLogin表60w记录,多账号登录6w执行需要4s多(数据仅供参考)

  • 按照曲线方式统计每天登录人数、累计登录人数
  1. SELECT
  2. ROW_NUMBER ( ) Over ( ORDER BY LoginTime DESC ) AS Sort,
  3. LoginTime,
  4. Count( lg.RepeatCount > 0 ) AS LoginCount
  5. FROM
  6. ExamStu
  7. LEFT JOIN ( SELECT IdentificationID, DATE_FORMAT(Max(LoginTime), '%Y-%m-%d %H') AS LoginTime, Count( * ) AS RepeatCount FROM StuLogin GROUP BY IdentificationID ) lg ON ExamStu.IdentificationID = lg.IdentificationID
  8. WHERE
  9. ExamStu.ExamDefineId = @ExamDefineId
  10. GROUP BY
  11. LoginTime
  12. ORDER BY
  13. LoginTime DESC

两个表关联,又使用内置函数,需要的时间也比较久

2.4优化思路

  • 减少表关联,能尽量在一个表中统计就在一个表中进行统计
  • 减少函数使用,考虑增加冗余字段

2.4.1修改后表数据库设计

img
在ExamStu表中增加登录时间(LoginTime yyyy-MM-dd HH格式),增加登录次数,默认登录次数为0。

2.4.2修改后流程数据

img
考生登录时,同步更新考生表中登录时间和登录次数

2.4.3修改后Sql语句

  • 统计任务考生人数,已登录人数,未登录人数,多账号登录人数
  1. SELECT
  2. count( 1 ) StuCount,
  3. Sum( LoginCount > 0 ) LoginCount,
  4. Sum( LoginCount > 1 ) MultipleLogins
  5. FROM
  6. ExamStu
  7. WHERE
  8. ExamDefineId = @ExamDefineId
  • 按照曲线方式统计每天登录人数、累计登录人数
  1. SELECT
  2. ROW_NUMBER ( ) Over ( ORDER BY LoginTime DESC ) AS Sort,
  3. LoginTime,
  4. Count( LoginCount > 1 ) AS LoginCount
  5. FROM
  6. ExamStu
  7. WHERE
  8. ExamStu.ExamDefineId = @ExamDefineId
  9. GROUP BY
  10. LoginTime
  11. ORDER BY
  12. LoginTime DESC

总结

大部分人面对的编程不复杂,多注意细节。

原文链接:https://www.cnblogs.com/wuyongfu/p/18083082

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号