需求背景:
某大型物流公司CRM提供可视化营销功能,一线员工可以在界面中直接按条件搜索到本门店下属各个用户:潜在客户,大客户,散户等,并显示用户的各种数据:基本信息,来源信息,花费金额,花费频率,回访信息,统计报表等数据;
涉及到表 :用户表基本信息表,用户附加信息表,订单表,用户来源表
表基数:用户表1000万,附加信息3000万,订单表5000万,用户来源表1000万
正式进入查询阶段:
第一阶段sql查询:在数据库中添加相应索引,通过条件减少sql执行时,搜索范围
优化结果:12秒完成一次搜索
第二阶段数据表结构优化:相应的表添加分区,以部门为分区单位进行range分区,
优化结果:5秒完成一次搜索
压测结果:30并发下,数据库CPU消耗达到85%
成本增加:多张表分区的维护成本:分区带来在线重定义工作,分区后全局索引重建,分区索引重建等工作量
第三阶段数据表结构优化: 在1,2基础上,增加统计数据部分的物化视图,中间表
优化结果:1.2秒完成一次搜索,
压测结果:通过50并发(300次请求每秒)压测,数据库CPU消耗在70%以内,其他指标正常
成本增加: 中间表的维护,增量更新脚本,全量恢复脚本;物化视图的维护成本,增量更新脚本
一个半月终于将这么看似庞大且操蛋的需求完成了,过程中基本天天泡在DBA哪里,优化sql,优化数据表,任何一个又可能的过程都不会放过,险些转行做了DBA;当时感觉是一个很屌的一个成果,但是现在看来,很多需要反思之处!!!
总结一下:对于千万级别的数据而已,说大不大说小不小,一般这个级别SQL本身的查询优化以及很乏力了,需要依靠数据表结构 数据库层的一些优化才能够到达预期的目标,而且会因为这些的增加,增加很多其他的维护成本:多出来很多中间表,中间表的维护脚本,增量更新的脚步等等,有时候也要考虑一下这些成本的增加是否值得或者适合,或者可以考虑一下新型的技术来解决比如spark/strom等新型的数据处理技术,但是这样成本会更高一点点,需要全面的权衡
--------------------------------------------------------
2016-8-29更新
对于业务类型的表的设计,建议使用关系型数据库,日志类的表可以用非关系型的数据来代替
关系型数据库,在使用时的关联操作,最好是同一个业务模型内的表,这样做的好处,为后面表的分库带来很好的可能,这个可能一个是指需要,一个指可行性,如果开始就这去注意,也不必担心上述各种分区,更新等成本的增加,因为使用分库 分表会更加方便;
那么怎么理解同一个业务模型:如用户表,用户附加信息表,用户基本信息表,这都是用户模型内的,这三种表之间的关联查询可能性很大,如果三张表都基于userid 做分表,其实就可以保证,某一个userid 传输过来,可以很确定的对应三张表的那些子表,直接进行关联查询,这样是没有问题;再比如有一张表,商品的领取记录,这个表分表的维度如果是userid,其实也好理解,现在有一个需求,查询某个用户兑换的商品的基本信息,这个时候涉及到两个问题,一个是用户的兑换记录,一个是商品基本信息,现在有商品业务模型(商品基本信息),用户基本信息,用户兑换表(用户模型),userid 传输过来可以定位到用户的兑换记录所在子表,查询出goodIdList,这个是一批商品id,但是这批id不能直接关联商品基本信息表,应该取出来,根据goodid定位分表并查询结果,这个时候,整个查询被分为两个部分:查询用户兑换的商品id,根据商品id 查询商品基本信息,项目伊始养成减少不必要的表关联,还是必要的,说到这里,项目中的DAL层也是必要的,可以做表库的路由,层次比较分明一点
分享到:
相关推荐
在Java编程中,级联查询和分页查询是数据库操作中的常见需求,特别是在处理大量数据时。级联查询用于获取一个实体的相关实体信息,而分页查询则用于提高查询效率和用户体验,避免一次性加载过多数据导致性能下降。...
6. **最佳实践**:在实际开发中,应根据业务需求谨慎选择级联类型,避免过度使用,同时注意性能优化,比如使用批处理等技术。 7. **源码解析**:可能涉及Hibernate框架源码中关于级联操作的部分,帮助深入理解其...
为了优化查询性能,可以采用多种策略,比如使用迫切连接查询来减少SELECT语句数量,利用延迟加载避免加载不必要的数据,或者使用Query的`iterator`方法减少字段以降低数据库访问次数。此外,批量处理数据也是提升...
JSON级联查询是一种常见的前端开发技术,特别是在处理省市区选择这样的多级联动数据时。这种技术主要用于构建用户界面,使得用户能够逐级选择一个地区的省、市、区,每一步的选择都会更新下一步可选项,以确保数据的...
在IT领域,动态实现下拉列表框的三级级联查询是一项常见的前端交互功能,它能够为用户提供更加便捷的导航和筛选体验。在这个场景中,我们使用JSP(JavaServer Pages)脚本语言来实现这一功能。JSP是Java平台上的...
本主题聚焦于“Jquery实现ajax二级级联查询”,这是一个常见的前端交互设计,常见于下拉菜单联动,例如省份选择后自动更新城市选择。在这个场景中,我们通常会利用服务器端(如JSP或Servlet)动态生成XML文件,因为...
6. **挑战与未来方向**:尽管级联字典带来了诸多好处,但其构建和优化过程也相对复杂,需要大量的计算资源。未来的研究可能会集中在如何高效地构建级联字典,以及如何利用深度学习等技术进一步优化字典的性能。 ...
### 采用级联的优化Mel滤波器 #### 摘要 本文深入探讨了将Mel域滤波器组应用于语音增强技术中的方法,并提出了基于ETSI标准核心维纳算法的优化方案。此方法旨在保证语音清晰度的同时,有效地降低背景噪声。特别地...
在IT领域,级联失效(Cascading Failure)是一种复杂的现象,特别是在网络系统中,如电力网格、互联网或通信网络。当一个组件故障时,它可能导致其他相关组件相继失效,从而引发大规模的系统崩溃。MATLAB作为一种...
在这样的表中,级联删除是确保数据完整性的一个重要功能,即删除某条记录时,与其相关的所有依赖记录也应被删除。然而,自关联表的级联删除并不像简单的外键级联删除那样直接,因为它涉及到了递归关系。 在上述标题...
在Python开发领域,特别是在机器学习应用中,"级联优化网络实现感光图片合成"是一种高级的技术,用于生成逼真的图像。这个主题涉及到计算机视觉、深度学习和图像处理等多个方面,其中Cascaded Refinement Networks...
处理完成后,数据可以通过ETL(提取、转换、加载)过程导入到Mysql数据库中,建立合适的表结构,如采用层次化的树状结构,便于查询和维护。 此外,为了提高查询效率,可以创建索引,特别是对于经常用于查询的字段,...
理解这两种级联方式对于理解SDH网络的运作机制和优化网络性能至关重要。 在"虚级联与相邻级联.doc"文档中,你将找到更详细的介绍,包括它们的工作原理、配置方法以及在实际网络部署中的应用场景。这份资料对于初学...
5. **测试与优化**:完成上述步骤后,通过`test6.jsp`这样的页面进行测试,确保级联效果正确无误。同时,要考虑性能问题,尤其是XML文件较大时,可能需要实现缓存或预加载策略以提高用户体验。 总之,使用XML文件...
比方,为了提高多表级联查询的效率,能够合理地使用冗余字段;对于大表,能够使用行的水平分割或者相似Oracle分区的技术;为了提高数据的查询的效率,能够建立有效水平分割或者相似Oracle分区表的技术;为了提高...
1. 数据优化:城市数据可以提前预加载或按需加载,避免一次性加载大量数据导致性能问题。 2. 用户缓存:保存用户的上次选择,下次打开时自动显示,提供便捷的操作体验。 3. 热门城市推荐:在级联选择前展示热门城市...
在网页开发中,级联选择是一种常见的交互设计,特别是在处理地理区域信息时,如省份、城市的选择。"jQuery实现级联地区选择"这个主题...理解并掌握这种实现方式对于提升Web开发技能和优化用户界面设计具有重要意义。
因此,合理选择级联类型并优化事务管理是至关重要的。 在实际应用中,基于Session的级联操作通常配合Transaction进行。例如,我们可以使用SessionFactory创建Session,然后开启一个Transaction,对主表和从表进行...
级联森林结合了决策树的高效性和随机森林的多样性,旨在优化预测性能和计算效率。下面将详细介绍级联森林算法及其相关知识。 级联森林算法的起源与核心概念: 级联森林是由多个阶段组成的模型,每个阶段都包含一个...
总的来说,级联Ajax实现方式结合了PHP的后端处理和Ajax的异步通信,通过分表策略优化数据库查询,利用JavaScript动态更新前端UI,从而提供了一种高效、流畅的用户交互体验。在实际项目中,还需要考虑错误处理、数据...