深入浅出mysql分库分表

news2024/7/7 18:05:44

文章目录

    • 为什么要分库分表?
    • 什么场景下才需要分库分表?
      • 1. 数据量增长导致数据量过大--分表
      • 2. 高并发访问--分库
      • 3. 地理分散的业务--分库
    • 分库分表的区别
      • 分库(Database Sharding)
      • 分表(Table Partitioning)
    • 垂直拆分、水平拆分的区别
      • 垂直拆分(Vertical Partitioning)
      • 水平拆分(Horizontal Partitioning)
    • 浅谈

分库分表也是一个老生常谈的问题,很多人都习惯把分库分表放在嘴边,来显得高大上,其实我对于这点是非常不赞同的。先说明关键点:“ 非必要绝对不要进行分库分表

为什么要分库分表?

很多人总是第一反应说因为高并发,其实这个回答是非常不严谨的。我见过非常多的高并发系统都是单库单服务,照样跑的很稳定。其实分库分表的核心是**《数据库面临了性能瓶颈》**
所以分库分表是只有在数据库的性能处理能力确实满足不了当前情况,且已经很难靠业务进一步提升后,才采取的必要措施,如果性能满足的情况下,非必要绝对不要进行分库分表
因为分库分表一定会带来额外的复杂性和挑战,带来的成本也是巨大的

  1. 增加复杂性:开发者需要处理数据的分片逻辑、路由请求到正确的数据库实例等,这增加了开发和维护的难度
  2. 数据一致性问题:在分布式数据库环境中,保持数据的一致性是一个挑战。跨多个数据库实例的事务处理更加复杂,可能导致数据不一致的风险
  3. 事务管理困难:传统的数据库事务(ACID属性)在分库分表后变得难以实现。跨多个数据库的事务需要额外的协调机制,这可能影响性能
  4. 查询性能下降:虽然分库分表可以提高单个数据库的性能,但跨多个数据库的查询可能需要更多的协调和数据聚合,这可能导致整体查询性能下降
  5. 数据迁移和同步问题:数据迁移到新的分库分表架构可能非常复杂和耗时。此外,保持数据在多个数据库之间的同步也是一个持续的挑战
  6. 增加运维成本:管理多个数据库实例需要更多的运维工作,包括监控、备份、故障恢复等,这会增加运维成本
    虽然当前分库分表的技术已经相当成熟了,但是对于这个最终的选择仍然需要慎重

什么场景下才需要分库分表?

1. 数据量增长导致数据量过大–分表

这个应该很好理解,就是单表的存储的数据量超过一定的阈值,比如可能单表数据1000W条,或者可能占用了3-4G的磁盘,这个时候sql查询的性能会明显的下降,并且这个时候通过优化索引也没有办法很好的解决的情况下,这个时候就可以考虑用分表的方式将数据分散到多个表里面
这里通常采取的是横向拆分

这里的核心其实就是因为数据量的增多,导致B+树层数的增加,导致IO增加,引起性能下降。其实单表最多能记录多少条数据而不卡这个跟单条数据的大小也是有很大的关系的,具体业务具体分析,记住技术是为业务服务的,业务也倡导技术的发展

但是这里在最终确定选择这个方案前,可能还有其他考量,比如确定大量数据的原因,历史数据是否一定需要保存(比如起一个定时任务每天定时清理三个月前的数据)?是否可以直接删除或者存档es等来缓解单表数据量的压力,如果可以当然也没必要分表

2. 高并发访问–分库

单库的访问量过高,导致数据库压力过大,也是一个核心问题。这个可能也跟数据库机器的性能相关,对于机器好的服务来说,可能抗压能力更强,但是如果再高点比如7-8k qps,数据库的稳定性也面临着相当大的压力。这个时候就不是分表的问题了,这里应该是采用分库的方式,通过增加数据库的方式将访问的压力分散到多个数据库实例中,来提高整体的并发处理能力
一般的分库都是搭配微服务架构,常见的做法是根据业务的归属拆分不同的库,将不同的表拆分到不同的库中以达到专库专用,在降低风险的同时也减低了耦合度

3. 地理分散的业务–分库

这个比较少见,业务覆盖多个地区或国家,需要在不同地理位置提供服务,然后在地区本地部署服务以减少时延,或者某些地区的数据保护法规要求数据必须存储在本地等等,这里就不做扩充

分库分表的区别

分库(Database Sharding)

定义: 分库是指将数据分布到多个数据库实例中,每个实例可以是独立的数据库服务器或者集群。通常用于处理跨多个业务模块的大规模数据,适用于业务模块之间相对独立的场景
特点:

  • 每个数据库实例存储的数据是独立的,互不干扰
  • 可以针对不同的业务模块或数据类型进行分库
  • 通常用于解决单一数据库实例无法承载的数据量或并发请求量问题。

适用场景:

  • 业务模块之间关联性不大,可以独立存储和管理
  • 数据量或访问量非常大,单一数据库无法满足性能需求
  • 需要根据业务模块进行物理隔离,例如出于安全或合规性考虑

分表(Table Partitioning)

定义: 分表是指将单个表中的数据分割成多个子表,这些子表可以分布在同一个数据库实例中,也可以分布在不同的实例中。
特点:

  • 子表之间在逻辑上是连续的,但在物理上是独立的
  • 通常基于某种键值(如时间戳、ID范围)进行数据分割
  • 可以提高查询和更新的性能,尤其是在处理大量数据的表时

适用场景:

  • 表中的数据量非常大,单一表的维护和查询效率低下
  • 需要对数据进行逻辑上的分组,例如按照时间范围存储日志数据
  • 希望简化数据管理,例如通过分表来实现数据的自动归档和清理

垂直拆分、水平拆分的区别

垂直拆分(Vertical Partitioning)

定义: 垂直拆分是指根据数据表的列来拆分数据,将一个表中不常用的列或业务逻辑上相对独立的列拆分到不同的表或数据库中。垂直拆分是按列进行的,关注的是表的宽度。这个一般很少在系统后续优化中使用,除非是大规模的重构,一般会在数据库设计的初期就考虑好相关的问题。举例假设拆分一张用户表,将用户工号,用户名等关键字段放在主表,将性别,学历等其它字段放到子表,这样其实业务中用到这些字段的地方都需要修改,成本也是很高的
特点:

  • 减少了表的宽度,每个表只包含一部分列
  • 可以提高查询性能,因为查询时只需要访问相关的列
  • 有助于业务逻辑的分离,使数据库更加模块化

适用场景:

  • 当表中包含大量列,但查询通常只访问其中一小部分列时
  • 需要根据业务逻辑对数据进行分离,例如将用户信息和交易记录分开存储

水平拆分(Horizontal Partitioning)

定义: 水平拆分是指根据数据表的行来拆分数据,将数据按照某种规则(如范围、哈希等)分割到不同的表或数据库中。水平拆分是按行进行的,关注的是表的长度。水平拆分可以减少单表的数据量,提高查询和更新的性能,有助于根据数据的属性进行逻辑分组
特点:

  • 减少了单表的数据量,有助于提高单表的查询和更新性能
  • 需要考虑数据分片键的选择,以确保数据均衡分布
  • 可能需要跨多个表或数据库进行查询,增加了查询的复杂性

适用场景:

  • 当表中的数据量非常大,单一表难以有效管理时
  • 需要根据数据的某个属性(如时间、地区、用户ID)进行逻辑分组

浅谈

现在发展的很快,其实大部分的情况下,服务器的资源都是过剩的,就导致大部分的公司项目团队和开发根本不关心sql的性能问题,本着快速做完能跑就行去开发代码,或者直接干脆以空间换时间,采用高性能的机器扩容等即可。我见过太多的开发的sql非常浪费,优化空间巨大

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

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

相关文章

Matplotlib 简介

import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4]) plt.ylabel(some numbers) plt.show() 当使用plot只传入单个数组时,matplotlib会认为这是y的值,并自动生成长度相同,但是从0开始的x值,所以这里的x会自动生成为 [0,1,2,…

Vue.js 案例——商品管理

一.需要做出的效果图&#xff1a; 二.实现的步骤 首先&#xff0c;先建一个项目&#xff0c;命名Table&#xff0c;在Table项目中的components里新建一个MyTable.vue文件。 第二步&#xff0c;在原有的 HelloWorld.vue中写入代码。 HelloWorld.vue代码如下&#xff1a; <…

土地规划与文化遗产保护:在发展浪潮中守护历史的脉络

在这个日新月异的时代&#xff0c;城市化进程如火如荼&#xff0c;土地规划作为引导城市发展方向的关键&#xff0c;承载着平衡发展与保护的重任。在追求现代化的同时&#xff0c;保护文化遗产不仅是对过去的尊重&#xff0c;更是对未来负责。本文旨在深入探讨如何在土地规划实…

云桌面运维工程师

一 深信服驻场工程师 1 深信服AC、AF、AD、NGAF、WOC Atrust、WAF项目实施经验者优先考虑。 负责云桌面POC测试 部署和配置&#xff1a;设置云桌面基础设施&#xff0c;包括虚拟化平台、云桌面管理软件和相关组件。确保正确配置网络、存储和安全设置。 用户体验&#xff1…

7.3数据库第一次作业

安装MySQL 1.打开安装包 2.选择自定义安装&#xff08;custom&#xff09;并点击下一步 3.自定义安装路径 4.点击执行 5.执行成功 6.默认选项点击下一步 7.选择新的授权方式并点击下一步 8.配置密码 9.默认配置并点击下一步 10.点击执行&#xff08;Execute&#xff09; 11.执…

bcc python开发示例

文章目录 1. hello_world.py2. hello_fields.py3. sync_timing.py4. disksnoop.py5. hello_perf_output.py6. bitehist.py7. vfsreadlat.py8. urandomread.py9. strlen_count.py10. nodejs_http_server.py11. task_switch.c12. 监视 do_execve 1. hello_world.py from bcc imp…

Ubuntu 24.04-自动安装-Nvidia驱动

教程 但在安全启动模式下可能会报错。 先在Nvidia官网找到GPU对应的驱动版&#xff0c; 1. 在软件与更新中选择合适的驱动 2. ubuntu自动安装驱动 sudo ubuntu-drivers autoinstall显示驱动 ubuntu-drivers devices3. 安装你想要的驱动 sudo apt install nvidia-driver-ve…

React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch

目录 1&#xff0c;原生 Switch 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Switch 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; function News() {return <div className"p…

Qt界面中的子窗口实现鼠标拖动边缘改变大小以及移动(完整demo代码)

目录 效果 拖拽 移动​编辑 实现 DragResizeWgt类.h文件 DragResizeWgt类.cpp文件 使用 testwidget窗口.ui文件 testwidget窗口.h文件 testwidget窗口.cpp文件 参考 效果 想要的效果就是类似于QT IDE中的效果&#xff0c;可以拖动边缘改变大小&#xff0c;用户自身可…

传承与创新,想让认字更简单?就来看《米小圈动画汉字》吧!

汉字&#xff0c;作为中华文化的精髓和根基&#xff0c;自古以来便承载着中华民族的思想与记忆。在现代社会&#xff0c;随着文化多样性的崛起和科技进步的推动&#xff0c;汉字的教育也更加的多元化&#xff0c;《米小圈动画汉字》作为一项全新的教育资源&#xff0c;不仅致力…

WAIC热点聚焦|具身智能简介:AI新浪潮的领跑者

WAIC热点聚焦|具身智能简介&#xff1a;AI新浪潮的领跑者 引言 随着"具身智能"&#xff08;Embodied Intelligence&#xff09;的火热讨论&#xff0c;2024年标志着人机交互新时代的开启。在大模型技术的推动下&#xff0c;机器人响应语音指令成为现实&#xff0c;…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示DS3231 RTC时间

LCD ST7735显示DS3231 RTC时间 文章目录 LCD ST7735显示DS3231 RTC时间1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板 (ESP-12E) 和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印(带…

CS算法(二)—— 斜视SAR点目标仿真

SAR成像专栏目录 我们按照Cumming教授所著的《合成孔径雷达成像——算法与实现》7.6节的点目标参数进行仿真,斜视角设置为8,中心斜距改为1000km。先放最终的仿真结果: 1. 参数配置 在中心点和中心的的上下左右方向设置5个点目标 : function para=config_sar_para_cumming(…

unity强力配置插件Luban【Next最新版本】(二)本地化

文章目录 前言一、快速实现静态本地化1、表格格式2、本地化文本3、修改bat文件3、打表 二、多语言切换1、修改bat文件2、增加本地化管理脚本3、测试 总结 前言 无需多言&#xff0c;本地化&#xff08;Localization&#xff0c;简称 L10N&#xff09;是指将产品、内容或服务适…

人工智能在日常生活中的十大应用:从医疗到智能家居

人工智能已成为当今人类日常生活的重要组成部分&#xff0c;无论您是否意识到&#xff0c;它几乎在所有场景中都能提供帮助。每次您进行网络搜索、在线预订旅行、接收来自京东等购物平台的产品推荐又或是打开您的新浪、抖音时&#xff0c;都能看到影子&#xff0c;这些只是一些…

Element中的消息提示组件Message和弹框组件MessageBox

简述&#xff1a;在 Element UI 中&#xff0c;Message和MessageBox都是比较常用的组件&#xff0c;Message用来提示消息&#xff0c;而MessageBox是一个用于创建模态对话框的组件。它可以用于在页面上快速展示信息、警告或错误提示&#xff0c;而不会阻止用户的其他操作。简单…

每日复盘-20240704

今日关注&#xff1a; 20240704 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…

Linux和mysql中的基础知识

cpu读取的指令大部分在内存中&#xff08;不考虑缓存&#xff09; 任何程序在运行之前都的加入到内存。 eip->pc指针&#xff0c;指明当前指令在什么位置。 代码大概率是从上往下执行的&#xff0c;基于这样的基本理论。既可以将一部分指令加载到CPU对应的缓存中&#xf…

B站大课堂-自动化精品视频(个人存档)

基础知识 工业通信协议 Modbus 施耐德研发&#xff0c;有基于以太网的 ModbusTCP 协议和使用 485/232 串口通信的 ModbusRTU/ASCII。 Modbus 协议面世较早、协议简洁高效、商用免费、功能灵活、实现简单&#xff0c;是目前应用最广泛的现场总线协议。 我的笔记里边有一些推荐…

Django学习第四天

启动项目命令 python manage.py runserver 分页功能封装到类中去 封装的类的代码 """ 自定义的分页组件,以后如果想要使用这个分页组件&#xff0c;你需要做&#xff1a; def pretty_list(request):# 靓号列表data_dict {}search_data request.GET.get(q, &…