分库分表

news2024/9/24 13:24:05

分库,分表,分库分表

只分库“,“只分表“,“既分库又分表"

何时分库

在面对高并发的情况下,数据库连接成为性能瓶颈。当数据QPS过高导致数据库连接数不足时,考虑分库。在读多写少的场景下,增加多个从库或使用分库方法,实现数据库的高可用。

避免大量数据集中访问在单台机器上,对磁盘IO、CPU负载造成过大压力,影响性能。

分库与添加Slave机器的关系

  1. 添加Slave机器:

    • 读写分离:通过添加Slave机器实现主从复制,将读操作分散到多个机器上,减轻主库的读压力。
    • 提高查询性能:Slave机器可处理大量只读查询。
    • 异步复制:主库执行后,数据会异步复制到Slave机器上,可能导致一定延迟。
  2. 分库:

    • 水平扩展:分库可将数据划分到不同数据库实例中,每个实例负责一部分数据,可通过在同一服务器实例中运行不同数据库实例或在不同服务器上运行不同db实例实现。

如进行微服务拆分,把单一数据库拆到不同的数据库当中
在这里插入图片描述

什么时候分表

分表解决数据量大的情况。当单表数据量非常大、并发量不高、数据连接足够但存储查询遇到瓶颈时,需减少单表数据量,提高速度。通常在单表行数超过500万行或单表容量超过2GB后,考虑分库分表。

在这里插入图片描述

何时既分库又分表

解决并发量和数据量都很大的情况。通常,高并发大数据量同时发生,因此经常遇到分库分表的情况。当数据库连接不足、同时单表数据量很大、查询速度很慢时,需要进行分库分表。

水平拆分和垂直拆分

  • 垂直拆分: 将表中某记录的多个字段拆分到多个表中。
  • 水平拆分: 将一张表中不同记录分别放到不同表中,减少单表数据。

水平拆分。把不同的用户的订单分表拆分到不同的表中,每个表中维护一些记录
在这里插入图片描述

垂直拆分减少字段数,使每个单表数据存储减少;水平拆分将不同用户的订单分表,每表维护一些记录。
在这里插入图片描述

分表的字段选择

分表的字段决定了数据如何在不同的分表中的划分和存储,比如按用户分表,按时间分表,按地区分表,这里面的用户,时间,地区就是分表的字段
需要注意的是(按照买家进行分表是把所有相同的买家信息放在同一张表中,而不是一个买家一个表)

  1. 用户ID:按照用户ID分表,将同一个用户的数据分到同一个分表,便于按用户进行查询,这样方便避免热点数据的数据倾斜,同时方便进行水品扩张,将新的买家的数据分布到新的分表中,不影响已有的分表
  2. 时间:按照时间进行分表,按照年,月,日等,使用在按时间范围查询场景,方便后期的数据清理
  3. 地区:按照地区分表,适用于有地域数据的数据

卖家查询怎么办

我们一般都是使用买家ID来实现分表,避免某些大卖家的大量数据导致数据倾斜的问题
但是买家查询很方便,那么卖家如何查询呢

由于卖家可能会涉及到多个买家的表,如果直接在分表中查询就会涉及到跨表查询,影响性能,为了解决这个问题,就提出了同步一张卖家维度的表,这张表只用来查询,而不涉及写操作,卖家ID同样可以可以定位到这个卖家维度的表

我们可以使用binlog 或者Flink等同步方案,将写入买家的数据同步到卖家维度的表中,直接在这个卖家维度的表中查询,而不需要进行跨表查询

由于卖家表只用来查询,所以可以使用一些高性能db,如HBasePolarDB满足大查询量的需求

全局ID的生成

涉及到分库分表,就会引申出分布式系统的唯一主键ID的生成问题,因为在单表中我们可以使用数据库主键来做唯一的ID,但是做了分库分表,多张单表中的自增主键就一定会冲突,就不具有唯一性了

雪花算法

雪花算法具有全局唯一递增高可用的特点:

  • 1位符号位: 表示正负,通常这个位没有特殊用途。

  • 41位时间戳位: 精确到毫秒,可以容纳约69年的时间。表示当前时间戳,通常为当前值减去一个固定的起始时间戳。

  • 10位机器ID: 高5位是数据中心ID,低5位是工作节点ID,最多可以容纳1024个节点,确保在同一个时间戳内,不同的机器生成不同的ID。

  • 12位序列号位: 表示在同一时间戳和机器ID下的序列号,每个节点每毫秒从0开始不断累加,递增到4095。因此,雪花算法在同一毫秒内最多生成1024 * 4096个唯一的ID。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1228183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

场景交互与场景漫游-交运算与对象选取(8-1)

交运算与对象选取 在面对大规模的场景管理时,场景图形的交运算和图形对象的拾取变成了一项基本工作。OSG作为一个场景管理系统,自然也实现了场景图形的交运算,交运算主要封装在osgUtil 工具中在OSG中,osgUtil是一个非常强有力的工…

基于学生心理学算法优化概率神经网络PNN的分类预测 - 附代码

基于学生心理学算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于学生心理学算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于学生心理学优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

电子学会2023年6月青少年软件编程(图形化)等级考试试卷(四级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(四级) 一、单选题(共10题,共30分) 1. 下列积木运行后的结果是?( )(说明:逗号后面无空格) A.

【ATTCK】MITRE Caldera-路径发现插件

CALDERA是一个由python语言编写的红蓝对抗工具(攻击模拟工具)。它是MITRE公司发起的一个研究项目,该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的,能够较真实地APT攻击行为模式。 通过CALDERA工具,安全…

AOT:一个.Net 8最牛逼和最受欢迎关注的功能!

这次.Net 8发布,更新了诸多功能,但从各个编程社区看到大家讨论和交流最多的,还是AOT这个功能。 AOT本身在.Net 7就开始引入了,但这次.Net 8做了诸多更新: 1、增加了macOS 平台的 x64 和 Arm64 体系结构的支持&#x…

python中Thread实现多线程任务

目录 多线程概括: 使用 Thread 模块创建线程 如果不使用多线程: 多线程概括: 多线程是一种并发执行的编程方式,允许程序同时执行多个独立的线程,每个线程在程序中运行独立的任务。每个线程都是程序的基本执行单元&a…

智慧路灯控制系统设计方案思路及设计原则

智慧路灯系统依托于智慧路灯综合管理平台,实现点(智慧路灯)、线(道路)、面(城市)的三级监控,实现灯控、屏控、视频监控、数据采集、联动的统一。 1)一个城市的智慧路灯系…

Nodejs--Express框架使用

目录 一.概念 二.项目目录结构 三.app.js 四.项目需要的中间件 五.Mysql连接 六.日志配置 七.实体模型配置 八.统一结果封装 九.app.js的详细配置 十.自定义登录拦截器 十一.route路由配置 十二.controller处理 十二:静态页面: 十三&#xff…

RobotFramework进阶之自定义的python模块(十四)

引言 RobotFramework自动化框架(以下简称RF)之前文章我们讲了通过import第三方的library(RequestsLibrary等),在实际项目中第三方的包并不能满足我们的需要,此时我们可自己编写python模块(.py文…

百胜杯答题系统

近期太忙了 百胜方答题活动于近期终于告一段落,这个活动周期长,参与人数多,是我这几年做答题活动的一个巅峰之作 当然项目开发难度不大,主要是参与人数突破了百万,对我而言是一次很好的历练 具体的设计方案 百胜杯答…

Java Swing实现简单的文本编辑器

内容要求 1) 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法,在进行代码编写前要能够设计好自己的算法。 本次程序设计涉及到 Java 的基本语法,即课堂上所介绍的变量、条件语句、循…

qemu + busybox + 内核实验环境搭建(2023-11)

主要是参考网上的例子,网上的一些例子可能用的busybox 老旧,编译各种问题,以及rootfs hda的方式或者ramfs的方式。可能有些概念还是不清楚,以下是最终完成测试成功的案例。 下载kernel https://cdn.kernel.org/pub/linux/kernel…

接口自动化测试很难吗?来看看这份超详细的教程!

接口自动化测试框架目的 测试工程师应用自动化测试框架的目的: 增强测试脚本的可维护性、易用性(降低公司自动化培训成本,让公司的测试工程师都可以开展自动化测试)。 以下框架以微信公众平台开放文档实战 地址:https://developers.weixin.qq.com/doc…

复杂类型,查询--学习笔记

1&#xff0c;复杂类型 解决问题&#xff1a;一些不容易获取到的数据&#xff0c;例如数组类型&#xff0c;集合类型等&#xff0c;获取他们的数据 -- 1.创建表 create table tb_array_person(name string,city_array array<string> )row format delimited fields term…

hypermesh学习总结(一)

1、hypermesh导入导出 2、hypermesh如何使用拓扑命令,连接多个几何体为一个? 3、hypermesh模式选择 分别有显示动力学模式explicit,标准模式Standard3D(静力学及模态等)

【最新Tomcat】IntelliJ IDEA通用配置Tomcat教程(超详细)

前言 IntelliJ IDEA是一个强大的集成开发环境&#xff0c;能够大大简化Java应用程序的开发和部署过程。而Tomcat作为一个流行的Java Web服务器&#xff0c;其与IntelliJ IDEA的整合能够提供便捷的开发环境&#xff0c;让开发人员更专注于代码的创作与优化。 在配置IntelliJ IDE…

ROS参数服务器(Param):通信模型、Hello World与拓展

参数服务器在ROS中主要用于实现不同节点之间的数据共享。 参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 使用场景一般存储一些机器人的固有参数&…

【2023云栖】刘一鸣:Data+AI时代大数据平台建设的思考与发布

简介&#xff1a; 本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;刘一鸣 | 阿里云自研大数据产品负责人 演讲主题&#xff1a;DataAI时代大数据平台应该如何建设 今天分享的主题是DataAI时代大数据平台应该如何建设&#xf…

Ubuntu系统安装Python3.6.8-Python源代码编译安装-Python环境安装

一、背景 本文将着重介绍如何在Python环境下&#xff0c;安装Python3.6.8&#xff0c;以满足在Ubuntu系统中使用Python的需求。 二、详细步骤 安装Python的方法有很多&#xff0c;本文中我们采用源代码的方式安装Python&#xff0c;首先我们需要下载Python源代码&#xff1a;源…

一起Talk Android吧(第五百五十四回:分享一个Retorfit使用错误的案例)

文章目录 1. 案例场景2. 案例现象3. 原因分析和解决方案3.1 原因分析3.2 解决方案4. 经验总结各位看官们大家好,上一回中咱们说的例子是"解析Retrofit返回的数据",本章回中将分享一个 Retrofit使用错误的案例。闲话休提,言归正转,让我们一起Talk Android吧! 1. …