【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

MySQL 分组高级策略:挖掘数据中隐藏的见解 (mysql分库分表方案)

用户投稿2024-04-10热门资讯19

简介

MySQL 中的分组操作是数据分析和报告的关键部分。通过将具有相同特性的数据记录分组,可以轻松地汇总和聚合数据,以获得有意义的洞察力。除了基本的分组之外,MySQL 还提供了一系列高级策略,可以进一步加强分组功能并揭示隐藏在数据中的见解。

高级分组策略

MySQL 中的主要高级分组策略包括:

  • GROUP BY CUBE
  • GROUP BY ROLLUP
  • GROUPING SETS

GROUP BY CUBE

GROUP BY CUBE 策略创建一组嵌套的子集,其中每个子集都包含给定维度的所有可能组合。例如,考虑以下表:

| 地区 | 产品 | 销售额 | |---|---|---| | 北美 | 产品 A | 100 | | 北美 | 产品 B | 200 | | 欧洲 | 产品 A | 300 | | 欧洲 | 产品 B | 400 |

使用 GROUP BY CUBE 对地区和产品分组将生成以下子集:

  • [(地区)]
  • [(地区), (产品)]
  • [(地区), (产品), (NULL)]
  • [(产品)]
  • [(产品), (NULL)]
  • [(NULL)]

通过使用 GROUP BY CUBE,您可以轻松地查看销售额在所有可能维度组合中的分布情况,包括地区、产品或两者兼有。

MySQL 分组高级策略:挖掘数据中隐藏的见解 (mysql分库分表方案) 第1张

GROUP BY ROLLUP

GROUP BY ROLLUP策略创建一组层次子集,其中每个子集都包含给定维度的逐层汇总。例如,考虑以下表:

| 国家 | 地区 | 销售额 | |---|---|---| | 美国 | 北美 | 100 | | 加拿大 | 北美 | 200 | | 法国 | 欧洲 | 300 | | 德国 | 欧洲 | 400 |

使用 GROUP BY ROLLUP 对国家和地区分组将生成以下子集:

  • [(国家)]
  • [(国家), (地区)]
  • [(国家), (NULL)]
  • [(地区)]
  • [(地区), (NULL)]
  • [(NULL)]

通过使用 GROUP BY ROLLUP,您可以查看销售额在国家、地区或两者兼有的不同层次上的分布情况。

GROUPING SETS

GROUPING SETS 策略允许您指定一组自定义子集,这些子集可以创建更复杂的聚合。例如,考虑以下表:

| 产品 | 类别 | 销售额 | |---|---|---| | 产品 A | 食品 | 100 | | 产品 B | 饮料 | 200 | | 产品 C | 食品 | 300 | | 产品 D | 饮料 | 400 |

使用 GROUPING SETS 策略对产品和类别进行分组并计算每个子集的总销售额,可以生成以下子集:

sql GROUPING SETS((产品),(类别),(产品, 类别) )

这将生成以下结果:

  • [(产品)]
  • [(类别)]
  • [(产品), (类别)]

通过使用 GROUPING SETS,您可以根据需要创建任意数量的自定义子集,以探索数据的不同方面。

使用示例

让我们看一个


在数据库分库分表设计方案中,以下哪些属于常用的分库分表s方案

在数据库分库分表设计方案中,常用的方案如下:

1、垂直分库分表:这种方案是按照业务模块进行划分,不同的模块对应不同的数据库或表。这样可以降低单库的数据压力,同时也避免了业务模块之间的相互影响。

2、水平分库分表:这种方案是按照数据行的某些字段的哈希值或范围进行划分,分配到不同的数据库或表中。水平分库分表可以有效地解决单表数据量过大的问题。

3、混合分库分表:混合使用垂直和水平分库分表的方案。对业务模块进行垂直划分,再对每个模块的数据进行水平划分。这种方式可以兼顾垂直和水平分库分表的优点。

4、基于分布式数据库的解决方案:例如使用HBase、Cassandra等分布式数据库,这些数据库内部实现了数据的分片存储,对应用层透明,也可以作为一种分库分表的解决方案。

以上这些方案都有各自适用的场景和优点,选择哪种方案取决于具体的业务需求和技术栈。在进行分库分表设计时,还需要考虑数据一致性、事务处理、跨库查询等问题。

数据库分库分表设计方案的作用:

数据库分库分表设计方案的作用主要包括提升性能、增加可用性。随着单库中的数据量越来越大、数据库的查询QPS越来越高,对数据库的读写所需要的时间也越来越多,数据库的读写性能可能会成为业务发展的瓶颈。在这种情况下,就需要进行数据库性能方面的优化,其中分库分表是一种有效的解决方案。

在微服务架构中,每个服务都分配一个独立的数据库,这就是分库;而对一些业务日志表,按月拆分成不同的表,这就是分表。一般单表数据量超过500W或者2G的情况下,读写性能变得很差,而常规的优化手段已经不起作用,这时候就需要进行分库分表。

分库分表技术及技术方案

一、分库分表的必要性

分库分表技术的使用,主要是数据库产生了瓶颈,如单库的并发访问或单表的查询都超出了阈值。对系统使用造成一定的影响,不得已而产生的技术。

通过分库分表技术来解决此类问题,但正因为使用此技术,会产生ACID一系列的问题,各类中间件解决此类问题各有各的优势。

提示:如场景无必要,千万不要使用分库分表。

二、分库分表的思路

1、垂直区分

垂直分库:从业务角度,一个库分成多个库,如把订单和用户信息分成两个库来存储。这样的好处就是可以微服务了。每块的业务单独部署,互不影响,通过接口去调用。

垂直分表:把大表分成多个小表,如热点数据和非热点数据分开,提高查询速度。

2、水平区分

水平分表:同一业务如数据量大了以后,根据一定的规则分为不同的表进行存储。

水平分库:如订单分成多个库存储,分解服务器压力。

以上一般来说,垂直分库和水平分表用的会多些。

三、分库分表的原理分析

分库分表常用的方案:Hash取模方案和range范围方案;

路由算法为最主要的算法,指得是把路由的Key按照指定的算法进行存放;

1、Hash取模方案

根据取余分配到不同的表里。要根据实际情况确认模的大小。此方案由于平均分配,不存在热点问题,但数据迁移很复杂。

2、Range范围方案

四、分库分表的技术选型

1、技术选型

解决方案主要分为4种:MySQL的分区技术、NoSql、NewSQL、MySQL的分库分表。

(1)mysql分区技术:把一张表存放在不同存储文件。由于无法负载,使用较少。

(2)NoSQL(如MongoDB):如是订单等比较重要数据,强关联关系,需约束一致性,不太适应。

(3)NewSql(具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性):如TiDB可满足需求。

(4)MySQL的分库分表:如使用mysql,此种方案为主流方式。

2、中间件

解决此类问题的中间件主要为:Proxy模式、Client模式。

(1)Proxy模式

(2)Client模式

把分库分表相关逻辑存放在客户端,一版客户端的应用会引用一个jar,然后再jar中处理SQL组合、数据库路由、执行结果合并等相关功能。

(3)中间件的比较

由于Client模式少了一层,运维方便,相对来说容易些。

五、分库分表的实践

根据容量(当前容量和增长量)评估分库或分表个数 -> 选key(均匀)-> 分表规则(hash或range等)-> 执行(一般双写)-> 扩容问题(尽量减少数据的移动)。

在这里我们选用中间件share-jdbc。

1、引入maven依赖

2、spring boot规则配置

行表达式标识符可以使用${...}或$->{...},但前者与Spring本身的属性文件占位符冲突,因此在Spring环境中使用行表达式标识符建议使用$->{...}。

3、创建DataSource

通过ShardingDataSourceFactory工厂和规则配置对象获取ShardingDataSource,ShardingDataSource实现自JDBC的标准接口DataSource。然后即可通过DataSource选择使用原生JDBC开发,或者使用JPA, MyBatis等ORM工具。

浅谈mysql数据库分库分表那些事-亿级数据存储方案

mysql分库分表一般有如下场景 其中1,2相对较容易实现,本文重点讲讲水平拆表和水平拆库,以及基于mybatis插件方式实现水平拆分方案落地。 在 《聊一聊扩展字段设计》一文中有讲解到基于KV水平存储扩展字段方案,这就是非常典型的可以水平分表的场景。 主表和kv表是一对N关系,随着主表数据量增长,KV表最大N倍线性增长。 这里我们以分KV表水平拆分为场景 对于kv扩展字段查询,只会根据id + key 或者 id 为条件的方式查询,所以这里我们可以按照id 分片即可 分512张表(实际场景具体分多少表还得根据字段增加的频次而定) 分表后表名为kv_000~kv_511 id % 512 = 1 .... 分到 kv_001, id % 512 = 2 .... 分到 kv_002 依次类推! 水平分表相对比较容易,后面会讲到基于mybatis插件实现方案 场景:以下我们基于博客文章表分库场景来分析 目标: 表结构如下(节选部分字段): 按照user_id sharding 假如分1024个库,按照user_id % 1024 hash user_id % 1024 = 1分到db_001库 user_id % 1024 = 2 分到db_002库 依次类推 目前是2个节点,假如后期达到瓶颈,我们可以增加至4个节点 最多可以增加只1024个节点,性能线性增长 对于水平分表/分库后,非shardingKey查询首先得考虑到 基于mybatis分库分表,一般常用的一种是基于spring AOP方式, 另外一种基于mybatis插件。 其实两种方式思路差不多。 为了比较直观解决这个问题,我分别在Executor 和StatementHandler阶段2个拦截器 实现动态数据源获取接口 测试结果如下 由此可知,我们需要在Executor阶段 切换数据源 对于分库: 原始sql: 目标sql: 其中定义了三个注解 @useMaster 是否强制读主 @shardingBy 分片标识 @DB 定义逻辑表名 库名以及分片策略 1)编写entity Insert select 以上顺利实现mysql分库,同样的道理实现同时分库分表也很容易实现。 此插件具体实现方案已开源:目录如下: mysql分库分表,首先得找到瓶颈在哪里(IO or CPU),是分库还是分表,分多少?不能为了分库分表而拆分。 原则上是尽量先垂直拆分 后 水平拆分。 以上基于mybatis插件分库分表是一种实现思路,还有很多不完善的地方, 例如:

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

MySQL 分组高级策略:挖掘数据中隐藏的见解 (mysql分库分表方案) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
你上次访问网站的时间为:24-05-17,13:13:32 你第10访问网站的时间为:24-05-17 13:13:41