首页 > 数据库 >数据库 分表分库

数据库 分表分库

时间:2023-04-20 12:55:47浏览次数:35  
标签:分库 数据库 查询 拆分 分表 数据

一、分表分库
  1、垂直分区:
    根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。
    简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。

  垂直拆分的优点:

    可以使得行数据变小,在查询时减少读取的Block数,减少I/O次数。

    此外,垂直分区可以简化表的结构,易于维护。
  垂直拆分的缺点:

    主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。

    此外,垂直分区会让事务变得更加复杂水平拆分最好分库 。


  水平拆分

    水平拆分能够 支持非常大的数据量存储,应用端改造也少,但 分片事务难以解决 ,跨界点Join性能较差,逻辑复杂。
《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千
万以下的数据量是没有太大问题的。

    如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络I/O。


  水平分表:
    表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询次数
  适用场景
    1、表中的数据本身就有独立性,例如表中分表记录各个地区的数据或者不同时期的数据,特别是有些数据常用,有些不常用。
    2、需要把数据存放在多个介质上。
  水平切分的缺点
    1、给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作
    2、在许多数据库应用中,这种复杂度会超过它带来的
  优点,查询时会增加读一个索引层的磁盘次数


二、分库分表后面临的问题
  事务支持 分库分表后,就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
  跨库join
    只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。
  分库分表方案产品
    跨节点的count,order by,group by以及聚合函数问题 这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。数据迁移,容量规划,扩容等问题 来自淘宝综合业务平台团队,它利
用对2的倍数取余具有向前兼容的特性(如对4取余得1的数对2取余也是1)来分配数据,避免了行级别的数据迁移,但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有限制。总得来说,这些方案都不是十分的理想,多多少少都存在一些缺点,这也从一个侧面反映出了Sharding扩容的难度。
  ID问题
    一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由. 一些常见的主键生成策略


标签:分库,数据库,查询,拆分,分表,数据
From: https://www.cnblogs.com/kldywx/p/17334868.html

相关文章

  • 数据库 锁
    一、行级锁,表级锁和页级锁 在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎)。      MyISAM和InnoDB存储引擎使用的锁:      MyISAM采用表级锁(table-levellocking)。      InnoD......
  • 数据库3.49到3.68例程
    3.49查询每个学生及其选修课程的情况3.50对[例33]用自然连接完成3.51查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。3.52查询每一门课的间接先修课(即先修课的先修课)3.53改写[3.49查询每个学生及其选修课程的情况3.54查询每个学生的学号、姓名、选修的......
  • 记录一次使用 表达式引擎 自定义注解 还有 sql union all 实现对数据库数据提取、重组
    这样编写减少了前后端很多没必要的遍历,以及if判断并最大限度提高了代码的可变通性额外需要学习的是ORM框架下,如何接收多表(各表结构不同)操作后,sql返回的新结构的临时表问题表达式引擎用到的依赖<dependency><groupId>org.apache.commons</groupId>......
  • 关于DB2数据库基本信息查询语句
    1.1数据库的启停启动数据库:db2start关闭数据库:db2stop(在关闭前先执行db2forceapplicationall(关闭所有正在执行的连接))或者直接执行db2stopforce(不是优先选择))#--有时候db2forceapplicationall关闭不了一些active的连接时可以使用db2stopforce1.2数据库的创建及删......
  • 虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库
    金融行业数字化转型浪潮来袭,客户需求也正加速向在线金融服务转移。金融机构想要实现现代化改造技术堆栈,为客户提供实时交互、欺诈检测等一系列个性化创新服务,就必须重视遗留系统和传统数据库架构“老年病”问题!面对数字化颠覆带来的挑战和压力,接受变化是关键!一些极力打破传统束......
  • 数据库基础概述
    (一)数据库基础1.什么是数据库数据库这个术语的用法很多,一般来说,数据库是一个以某种有组织的方式存储的数据集合。理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的。数据库(database):保存有组织的数据的容器......
  • go项目中数据库连接,以及redis连接
     文件:common/mysql.go数据库连接文件packagecommonimport("gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema""log")varDB*gorm.DB//全局定义DBvardbErrerror//定义数据库错误funcinit(){dsn:=......
  • 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载
    56openEuler搭建Mariadb数据库服务器-安装、运行和卸载56.1安装配置本地yum源,详细信息请参考《openEuler22.03-LTS搭建repo服务器》。清除缓存。#dnfcleanall例如示例命令如下:[root@superman-21~]#dnfcleanall45filesremoved[root@superman-21~]#......
  • Shell多线程备份数据库
    Shell这么简单的脚本语言有多线程这一说吗?答案是有的。只不过它实现起来稍微有点难理解罢了,因为它借助了命名管道实现。所谓多线程就是原本由一个进程完成的事情现在由多个线程去完成。假如一个进程需要10小时完成的事情,现在分配10个线程,给他们分工,然后同时去做这件事情,最终可能就......
  • MySQL数据库事务
    什么是数据库事务数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。数据库事务的四大特性数据库事务的四大特性和程序事务相同,......