zoukankan      html  css  js  c++  java
  • 简单了解分库分表

    一、概述

    当数据量过大的时候对于数据库的性能将是很大的考验,因此将会选择进行分库或者分表,或者分库分表结合进行来减少单一数据库的压力,进而提高数据库的性能。从某种程度上说分库分表是一种分治法,将大量数据变成小量数据,大表拆分为小表,从而操作数量少的一部分。
    数据的拆分(Sharding)根据其拆分规则的类型,可以分为两种拆分模式。
    一种是按照不同的表(或者Schema)来拆分到不同的数据库(主机)之上,这种拆分可以称为数据的垂直(纵向)拆分;
    另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种拆分称为数据的水平(横向)拆分。

    分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。
    分库分表是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库, 将数据大表拆分成若干数据表,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

    二、垂直拆分

    垂直拆分:即根据业务分类来进行拆分
    垂直拆分优点:1、拆分后业务清晰,拆分规则明确;2、系统之间整合或扩展容易;3、数据维护简单。
    垂直拆分缺点:1、部分业务表无法join,只能通过接口方式解决,提高了系统复杂度;2、受每种业务不同的限制存在单库性能瓶颈,不易数据扩展和性能提高;3、事务处理复杂。

    垂直拆分又分为垂直分库和垂直分表。

    垂直分库:指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,从而达到多个服务器共同分摊压力的效果。它的核心理念是专库专用。

    垂直分库带来的提升:1、解决业务层面的耦合,使业务更加清晰;2、能对不同业务的数据进行分级管理、维护、监控、扩展等;3、高并发场景下,垂直分库在一定程度的提升IO、数据库连接数、降低单机硬件资源的瓶颈。

    垂直分表定义:将一个表按照字段分成多表,每个表存储其中一部分字段。也就是说将字段非常多的表拆分成多个表,每个表中分别存放一些字段信息,从而减少数据量,因为把数据量都分散在了多个表中。将使用频率高的字段存放在一个表中,使用频率低的字段放在另一个表中。
    垂直分表带来的好处是:1.避免IO争抢并减少锁表的几率;2.充分发挥热门数据的操作效率,操作频率高的数据为热门数据,操作频率低的数据为冷数据。

    垂直拆分带来的性能提升主要集中在热门数据的操作效率上,磁盘争用情况减少。

    为什么大字段IO效率低?
    第一、由于数据量本身大,需要更长的读取时间;第二、跨页问题,页是数据库存储单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页内存储行数少,因此IO效率较低;第三,数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO从而提升了数据库性能。
    通常我们按以下原则进行垂直拆分:
    1、把不常用的字段单独放在一张表;2、把text,blob等大字段拆分出来放在附表中;3、经常组合查询的列放在一张表中。

    由于垂直拆分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶颈,所以就需要采用水平拆分来解决垂直拆分的不足之处。

    三、水平拆分

    相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平拆分理解为是按照数据行的拆分,就是将表中的某些行拆分到一个数据库,而另外的某些行又拆分到其他的数据库中。

    几种典型的拆分分片规则包括:1、按照用户ID求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中;2、按照日期,将不同月甚至日的数据分散到不同的库中;3、按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。

    水平拆分优点:1、拆分规则抽象好,join操作基本可以数据库做;2、不存在单库大数据,高并发的性能瓶颈;3、应用端改造较少;4、提高了系统的稳定性和负载能力。
    水平拆分缺点:1、拆分规则难以抽象;2、分片事务一致性难以解决;3、数据多次扩展难度和维护量极大;4、跨库join性能较差。

    水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。水平分库是把同一个表拆到不同数据库中,它是对数据行的拆分,不影响表结构。
    它带来的提升:1、解决了单库大数据,高并发的性能瓶颈;2、提高了系统的稳定性及可用性。(稳定性体现在IO冲突减少,锁定减少,可用性指某个库出问题,部分可用。)

    水平分表是在同一个数据库内,把同一个表的数据按一定规则拆分到多个表中。
    它带来的提升:1、优化单一表数据量过大而产生的性能问题;2、避免IO争抢并减少锁表的几率。
    库内的水平分表,解决了单一表数据量过大的问题,分出来的小表中只包含一部分数据,从而使得单个表的数据量变小,提高检索性能。

    四、拆分共同的问题

    前面讲了垂直拆分跟水平拆分的不同和优缺点,会发现每种拆分方式都有缺点,但共同的缺点有:1、引入分布式事务的问题;2、跨节点Join的问题;3、跨节点合并排序分页问题;4、多数据源管理问题。

    一般来讲业务存在着复杂join的场景是难以拆分的,往往业务独立的易于拆分。如何拆分,拆分到何种程度是考验技术架构的一个难题。
    拆分的一些原则:
    第一原则:能不拆分尽量不要拆分。
    第二原则:如果要拆分一定要选择合适的拆分规则,提前规划好。
    第三原则:数据拆分尽量通过数据冗余或表分组(Table Group)来降低跨库Join的可能。
    第四原则:由于数据库中间件对数据Join实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表Join。

    五、由数据库的拆分引申的数据源管理思考

    主要有两种思路:A、客户端模式,在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个数据库,在模块内完成数据的整合;B、通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明。

    六、总结

    垂直分表:可以把一个宽表的字段按访问频次、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失。

    垂直分库:可以把多个表按业务耦合松紧归类,分别存放在不同的库,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。

    水平分库:可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能。它不仅需要解决跨库带来的所有复杂问题,还要解决数据路由的问题。

    水平分表:可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。

    一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案。在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大且持续增长再考虑水平分库、分表方案。

    七、参考博文

    (1) https://blog.csdn.net/weixin_44062339/article/details/100491744?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7
    (2) https://blog.csdn.net/mingover/article/details/71108852
    (3) https://blog.csdn.net/CrankZ/article/details/84679742?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3 (比较详细)

  • 相关阅读:
    delphi xe10 FMX 启动参数
    delphi xe6 JSON 测试
    oracle实现http请求,oracle发送http请求。
    ORACLE存储过程调用Web Service
    新搭建的iis服务器,运行网站报 System.BadImageFormatException:未能加载文件或程序集”....“或它的某一个依赖项。
    c#的http请求工具类核心代码
    vue-cli3 取消关闭eslint 校验代码
    quartz.net数据库持久化教程
    sql备份一张表的数据
    iis 长期无访问导致定时任务不执行的解决方案
  • 原文地址:https://www.cnblogs.com/jasonboren/p/12693767.html
Copyright © 2011-2022 走看看