`
Everyday都不同
  • 浏览: 725201 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

数据量大的表的分表方案 以及 跨(同类型的)表查询遇上分组时需要注意的点

阅读更多

最近着手对数据量比较大的表的改善工作。当一张表的数据量很大,并且在定时或实时的增加数据时,这时候就需要考虑表的容量,因为一张表的数据不可能无限大,所以考虑分表就迫在眉睫~~

 

解决方案:

1)结合表内数据的Insert频率,大概计算下表数据的大小。规划每张表最大的数据量,考虑按年或月或天分表,表名基本相同,以时间字符串作为后缀(如:表名_yyyy,表名_yyyyMM,表名_yyyyMMdd等);

2)假如最小维度的表的每条记录是按分钟入的(总之不是天),时间字段为“yyyyMMdd”格式(即“天”)。那么要求出一段时间的(哪天到哪天)按天分组的统计结果,直接查询该最小维度的表即可。

若该表是按天分开存储,需考虑跨表的情形,关于跨表的思想见我前一篇文章;

3)假如需要查询一段时间(哪月到哪月)的按“月”分组统计的情况,则不再建议直接查询最小维度的表,因为既要考虑分表,而且union all的表的数量太多,造成卡死,效率上不太现实。

——解决:定时任务每月初去统计上一个月的总体情况,时间字段为"yyyyMM"格式(即“月”),如最小维度的表是按月存储的,则读取上一个月的汇总情况,成为一条记录,该条记录即是上一个月的总体情况,专门存入一张如“表名_month”的表中,此时,不必实时去最小维度的表汇总,直接读取该month表就行啦;

4)假如需要查询一段时间(哪年到哪年)的按“年”分组统计的情况,同上,可在"表名_month"表中,在月维度的数据基础上汇总,存储在"表名_year"表中,此时这张year的表的每一条记录代表一个“年”的总体情况,时间字段为"yyyy"格式(即“年”),此时直接读取"表名_year"表即可。

5)在按月和按年定时汇总数据到相应维度的表的同时,也要建立下一个月的月表或下一年的年表。

 

接下来要讲的是同类型的表遇上分组时需要注意的地方,现假设有2张表itm_test和itm_test2,他们的时间字段为app,按探讨的背景,这2张表的app字段的值肯定是不会重复的。。

这2张表的数据情况如下:

itm_test表:



 itm_test2表:



 (现在假设app为时间字段。。这2张表的时间字段的值是不会重复的……)

 

情形一:按单个字段分组,这个字段非时间字段app。

写法一(2张表都group by之后再union all,并且查询条件分散在每张表):

 

(SELECT src,SUM(cnt) FROM itm_test WHERE app>'app2' GROUP BY src ORDER BY src) 
UNION ALL (SELECT src,SUM(cnt) FROM itm_test2 WHERE app<'app7' GROUP BY src ORDER BY src)

 查询结果:



 写法二(2张表先union all之后再group by,并且查询条件分散在每张表):

 

SELECT src, SUM(cnt) FROM ((SELECT * FROM itm_test WHERE app>'app2') UNION ALL (SELECT * FROM itm_test2 WHERE app<'app7')) tmp GROUP BY src ORDER BY src

 查询结果:



 
 

写法三(2张表先union all之后再group by,并且查询条件在union all之后的临时表里):

 

SELECT src,SUM(cnt) FROM((SELECT  * FROM itm_test) UNION ALL (SELECT * FROM itm_test2 ) tmp 
  WHERE app > 'app2' AND app < 'app7' GROUP BY src ORDER BY src 

 查询结果:



 

综上:写法一是错误的,因为原意是要统计一段时间内按src的cnt的汇总,但是写法一却有2条nbk5,即2个src相同的记录,这是违背初衷的。

 

情形二:按多个字段分组,其中一个字段包含时间字段app。

写法一(2张表都group by之后再union all,并且查询条件分散在每张表

 

(SELECT app,src,SUM(cnt) FROM itm_test WHERE app>'app2' GROUP BY app,src ORDER BY app,src ) 
UNION ALL (SELECT app,src,SUM(cnt) FROM itm_test2 WHERE app<'app7' GROUP BY app,src ORDER BY app,src )

 写法二(2张表先union all之后再group by,并且查询条件分散在每张表)

 

SELECT app,src, SUM(cnt) FROM ((SELECT * FROM itm_test WHERE app>'app2') UNION ALL (SELECT * FROM itm_test2 WHERE app<'app7')) tmp GROUP BY app,src ORDER BY app,src

 写法三(2张表先union all之后再group by,并且查询条件在union all之后的临时表里):

 

SELECT app,src,SUM(cnt) FROM((SELECT  * FROM itm_test) UNION ALL (SELECT * FROM itm_test2 ) tmp 
  WHERE app > 'app2' AND app < 'app7' GROUP BY src ORDER BY app,src 

 三种写法都是同样的查询结果:



 综上,此时是按多个字段分组统计的,并且其中有个字段是app(时间字段),三种写法都是等效的。

 

所以,当跨同类型的表查询遇上分组统计时,需要看时间字段是否在group by的条件当中:如果在,三种写法都是等效的,如果不在,写法一是错误的。查询条件不管是分散在每张表中还是集中在临时表中,都是一样的。临时表需要加上表别名,否则报错:

Every derived table must have its own alias

  • 大小: 6.9 KB
  • 大小: 7.3 KB
  • 大小: 3.6 KB
  • 大小: 3.5 KB
  • 大小: 3.7 KB
  • 大小: 6.4 KB
分享到:
评论

相关推荐

    MSSQLServer数据库大量数据按月份分表、存储过程指定时间段跨表分页查询

    资源里包含SQL文档:创建数据库和存储过程.sql 生成数据.sql 测试.sql 比较完善的大量数据分表功能代码,包含...数据按照每个月创建一个数据表,通过存储过程输入参数,按照指定日期跨表查询数据,并且可以分页查询。

    分表_利用python进行数据表分表_

    在数据分析和大数据处理中,将一个大表分成多个小表是一种常见的优化策略,这有助于提高查询效率、降低存储压力,并便于分布式处理。本主题将详细探讨如何利用Python进行数据表的拆分工作。 首先,我们需要了解为...

    kettle对数据分表插入

    在大数据场景下,单一的大表可能会导致性能瓶颈,因此通常会采用分区策略将数据分散到多个小表中,这被称为分表。这样做可以提高查询效率,减轻单个表的压力。Oracle数据库提供了多种分区策略,如范围分区、列表分区...

    Mysql分表查询,哈希,范围,列表

    【MySQL分表查询】在大型数据库系统中,随着数据量的不断增长,单表的数据规模可能会变得非常庞大,导致查询效率下降,系统性能受到影响。此时,分表技术就显得尤为重要。MySQL提供了多种分表策略,如哈希分表、范围...

    应对sharding-jdbc结合mybatis实现分库分表功能 分表的联合查询采用将mysql的数据同步到elasticsearch进行筛选

    在IT行业中,数据库扩展是解决高并发、大数据量场景下的常见问题。Sharding-JDBC是阿里巴巴开源的一款轻量级的数据库中间件,它允许开发者在不改变任何数据库语句的情况下,实现分库分表的功能,从而提高系统的读写...

    帝国CMS7.5管理副表分表(数据已经存在)数据迁移至其他分表.doc

    【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发...

    oracle 查询从分表取数据

    一个简单的oracle数据库环境下的存储过程,介绍了如何从带年月人的分表取数据

    09-数据库优化方案(二):写入数据量增加时,如何实现分库分表?_For_group_share1

    在实施分库分表时,需要注意避免常见问题,如不正确使用分区键导致查询效率低下,以及大量使用跨表查询。理解和选择合适的拆分策略至关重要,需要结合实际业务需求进行决策。同时,分库分表后可能引入的额外问题,如...

    Mybaits-plus优雅的实现多数据源及分表

    在IT行业中,数据库管理和优化是至关重要的环节,尤其是在大数据量的场景下。本文将深入探讨如何使用MyBatis-Plus优雅地实现多数据源及分表策略,为系统的高效运行提供支持。 首先,多数据源是指在一个应用中同时...

    数据分库分表之二叉树分库分表

    - 初始阶段需要预先规划好所有的表,否则后期的数据迁移工作量较大。 #### 五、结论 二叉树分库分表作为一种有效的数据分库分表策略,能够在保证数据一致性的同时,实现系统的高效扩展。尽管存在一些局限性,但在...

    spring动态数据源+mybatis分库分表

    在现代企业级应用中,随着数据量的增长,单表存储可能会遇到性能瓶颈,这时就需要引入分库分表的策略来优化数据库的性能。"spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架...

    大数据表的分表处理设计思想和实现(MySQL)

    1. **性能提升**:大型表在执行SQL时,由于数据量大,索引扫描和数据读取都会变慢,分表可以将数据分布到多个物理存储上,加快查询速度。 2. **负载均衡**:通过分表,可以将数据分散到多个服务器,实现负载均衡,...

    TP5+MySQL通用分表代码

    - 产品上线以后,数据量越来越大,当一个表有几十万上百万条记录的时候,是时候考虑分表了。【超过几千万记录的话,这个分表估计不适合。】 - 怎么做 - 分表情况,1:hash分表,按照目标表的id的hash值,写入对应...

    分库分表,多数据源的切换

    总之,分库分表和多数据源切换是解决大数据量场景下的重要手段。Sharding-JDBC作为优秀的开源框架,为开发者提供了便捷、高效、灵活的解决方案。通过学习和实践SSMDemo,我们可以更好地理解和掌握这一技术,从而优化...

    基于mybatis插件实现轻量级分库分表方案-亿级数据mysql存储解决方案-mybatis-sharding.zip

    在应对大数据量的存储与查询问题时,分库分表是一种常见的优化策略。MyBatis-Sharding 是一种基于 MyBatis 的轻量级分库分表解决方案,它可以帮助开发者有效地解决亿级数据量下的 MySQL 存储问题。下面将详细介绍 ...

    springmvc分库分表实际例子

    在IT行业中,数据库扩展是解决高并发、大数据量场景下的常见策略,而“分库分表”正是其中一种有效的手段。本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在...

    分库分表自动建库表小工具

    特别是在处理大数据量时,传统的数据库设计往往难以满足高并发和大数据量查询的需求。为了应对这一挑战,分库分表成为了一种有效的数据库架构优化策略。本文将详细介绍一款能够自动创建分库分表的工具——“分库分表...

    分库分表总结

    开发者在选择和实施分库分表方案时,需要充分评估业务需求、系统架构和现有技术栈,确保方案的可行性和扩展性。此外,持续关注和学习相关工具的发展,可以帮助我们更好地应对大数据时代的挑战。

Global site tag (gtag.js) - Google Analytics