0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

优化MySQL数据库中朴实无华的分表和花里胡哨的分库

5jek_harmonyos 来源:CSDN博客 作者:_陈哈哈 2021-08-26 16:33 1334次阅读

blog.csdn.net/qq_39390545/article/details/116248222

一、朴实无华的 - 分表

1、垂直分表

2、水平分表

二、花里胡哨的 - 分库

3、垂直分库

4、水平分库

总结

首先我们要知道分库、分表都是干啥的,本文主角还是我们的MySQL为第一视角。首先从字面意思来看:

分库:由单个数据库实例拆分成多个数据库实例,将数据分布到多个数据库实例中。

分表:由单张表拆分成多张表,将数据划分到多张表内。

要知道,对于大型互联网项目,数据量级可能不是我们能想到的,每日新增数据量过千万是常有的事儿,想靠单台MySQL服务器是不现实的。你项羽在牛B,也顶不住四个队友挂机啊!!项羽:???

随着业务数据量和网站QPS日益增高,对数据库压力也越来越大,单机版数据库很快会到达存储和并发瓶颈,就需要做数据库性能方面的优化,分库分表采取的是分而治之的策略,分库目的是减轻单台MySQL实例存储压力及可扩展性,而分表是解决单张表数据过大以后查询的瓶颈问题,坦白说,这些问题也是所有关系型数据库的“硬伤”。

今天我们就基于常见分库、分表的策略方式以及场景,来搞清楚我们到底啥时候用的到。常用策略包括:垂直分表、水平分表、垂直分库、水平分库。

一、朴实无华的 - 分表

1、垂直分表

垂直分表,或者叫竖着切表,是不是感受到该策略是以字段为依据的!主要按照字段的活跃性、字段长度,将表中字段拆分到不同的表(主表和扩展表)中。

特点:

每个表的结构都不一样;

每个表的数据也不一样,

有一个关联字段,一般是主键或外键,用于关联兄弟表数据;

所有兄弟表的并集是该表的全量数据;

场景 :

有几个字段属于热点字段,更新频率很高,要把这些字段单独切到一张表里,不然innodb行锁很恶心的,锁死你呀~~如用户表里的余额字段?不,我的余额就很稳定,一直是0。。

有大字段,如text,存储压力很大,毕竟innodb数据和索引是同一个文件;同时,我又喜欢用SELECT *,你懂得,这磁盘IO消耗的,跟玩儿似的,谁都扛不住的。

有明显的业务区分,或表结构设计时字段冗余;有些小伙伴看到第一点时,就发现陈哈哈是个菜鸡,用户表怎么会有余额字段?明显有问题啊!赶紧先到评论区喷陈哈哈一波~~然后笑嘻嘻的发现原来是个小尾巴,真不要脸是吧。。是的,因此不同业务我们要把具体字段拆开,这样才有利于业务后续扩展哦。

2、水平分表

水平分表,也叫“横着切”。。以行数据为依据进行切分,一般按照某列的自容进行切分。

手机号表,我们可以通过前两位或前三位进行切分,如131、132、133 → phone_131、phone_132、phone_133,手机号有11位(100亿),量大是很正常的事儿,这年头谁家老头老太太每个手机呢是吧。这样切就把一张大表切成了好几十张小表,数据量不就下来了。有同学就问了那我怎么知道我这手机号查哪个表呢?一看你就没认真看前两行标红的点,为啥标红嘞?比如我查13100001111,那我截取前三位,动态拼接到查询的表名上,就行了。

特点:

每个表的结构都一样;

每个表的数据都不一样,没有交集;

所有表的并集是该表的全量数据;

场景 :单表的数据量过大或增长速度很快,已经影响或即将会影响SQL查询效率,加重了CPU负担,提前到达瓶颈。记得水平分表越早越好,别问我为什么。。

你要有兴趣试一试,就关注我,让csdn研发同学给我的粉丝们分个表哈哈。。算了,别做梦了,忘了你是个菜狗了么~

二、花里胡哨的 - 分库

需要你注意的是,传统的分库和我们熟悉的集群、主从复制可不是一个事儿;多节点集群是将一个库复制成N个库,从而通过读写分离实现多个MySQL服务的负载均衡,实际是围绕一个库来搞的,这个库称为Master主库。而分库就不同了,分库是将这个主库一分为N,比如一分为二,然后针对这两个主库,再配置2N个从库节点。

3、垂直分库

纵向切库,太经典的切分方式,基于表进行切分,通常是把新的业务模块或集成公共模块拆分出去,比如我们最熟悉的单点登录、鉴权模块。熟悉的味道,记得有一次我把一些没用的表切到一个性能很好的服务器中,这服务器我专门用来学习,后来也不知被哪个狗腿子告密了~ 我**你个**,有种站出来,你个**东西。

特点:

每个库的表都不一样;

表不一样,数据就更不一样了~ 没有任何交集;

每个库相对独立,模块化

场景 :可以抽象出单独的业务模块时,可以抽象出公共区时(如字典、公共时间、公共配置等),或者想有一台属于自己的服务器时?

4、水平分库

以行数据为依据,将一个库中的数据拆分到多个库中。大型分表体验一下?坦白说这种策略并不实用,因为会对后台开发很不友好,有很多坑,不建议采用,理解即可。

特点:

每个库的结构都一样;

每个库的数据都不一样,没有交集;

所有库的并集是全量数据;

场景 :系统绝对并发量上来了,CPU内存压力大。分表难以根本上解决量的问题,并且还没有明显的业务归属来垂直分库,主库磁盘接近饱和。

总结

本文就到这里,希望你学废了!其实,在实际工作中,我们在选择分库分表策略前,想到的应该是从缓存、读写分离、SQL优化等方面,因为这些能够更直接、代价更小的解决问题。要记住动表就是动根本,你永远不知道这张表后面会连带多少历史遗留问题,如果是个很大型的项目,遇到些问题你就跟经理提议要分库分表,小心被呼死~

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7227

    浏览量

    90329
  • MySQL
    +关注

    关注

    1

    文章

    838

    浏览量

    27032

原文标题:老大让我优化数据库,我上来就分库分表。。。

文章出处:【微信号:harmonyos_developer,微信公众号:harmonyos_developer】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    工业智能网关采集能耗数据对接到MySQL数据库

    在工业生产中,对能耗数据的有效采集和管理对于企业的能源优化和成本控制至关重要。利用工业智能网关将能耗数据采集并对接到MySQL数据库,能够实
    的头像 发表于 02-26 13:56 193次阅读
    工业智能网关采集能耗<b class='flag-5'>数据</b>对接到<b class='flag-5'>MySQL</b><b class='flag-5'>数据库</b>

    水电表通过数据采集平台接入到MySQL数据库

    数字化、智能化的能耗监测管理系统十有必要。 对此,数之能提供基于数据采集平台实现水电表接入到MySQL数据库的解决方案,将用水、用电等能耗数据
    的头像 发表于 02-26 13:51 147次阅读

    数据库数据恢复——MySQL数据库误删除表记录的数据恢复案例

    本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,空间类型为独立空间。该MySQL
    的头像 发表于 02-22 09:44 266次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复——<b class='flag-5'>MySQL</b><b class='flag-5'>数据库</b>误删除表记录的<b class='flag-5'>数据</b>恢复案例

    或许我们都被分库约束了思维

    、Polardb、StarDB等等。 国内的项目好像很多都聚焦于分库的概念,包括很多的数据库团队都在尝试这个概念的落地和沉溺于性能的跑
    的头像 发表于 02-21 09:51 132次阅读

    从Delphi、C++ Builder和Lazarus连接到MySQL数据库

      从 Delphi、C++ Builder 和 Lazarus 连接到 MySQL 数据库 MySQL 数据访问组件(MyDAC)是一个组件
    的头像 发表于 01-20 13:47 329次阅读
    从Delphi、C++ Builder和Lazarus连接到<b class='flag-5'>MySQL</b><b class='flag-5'>数据库</b>

    适用于MySQL和MariaDB的Python连接器:可靠的MySQL数据连接器和数据库

    和 Linux 的 wheel 包分发。 直接连接 该解决方案使您能够通过 TCP/IP 建立与 MySQL 或者 MariaDB 数据库服务器的直接连接,而无需数据库客户端。另外
    的头像 发表于 01-17 12:18 251次阅读
    适用于<b class='flag-5'>MySQL</b>和MariaDB的Python连接器:可靠的<b class='flag-5'>MySQL</b><b class='flag-5'>数据</b>连接器和<b class='flag-5'>数据库</b>

    MySQL数据库的安装

    MySQL数据库的安装 【一】各种数据库的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】
    的头像 发表于 01-14 11:25 288次阅读
    <b class='flag-5'>MySQL</b><b class='flag-5'>数据库</b>的安装

    数据库是哪种数据库类型?

    数据库是一种部署在虚拟计算环境数据库,它融合了云计算的弹性和可扩展性,为用户提供高效、灵活的数据库服务。云数据库主要分为两大类:关系型
    的头像 发表于 01-07 10:22 260次阅读

    数据库数据恢复—Mysql数据库表记录丢失的数据恢复流程

    Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、
    的头像 发表于 12-16 11:05 365次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—<b class='flag-5'>Mysql</b><b class='flag-5'>数据库</b>表记录丢失的<b class='flag-5'>数据</b>恢复流程

    数据库数据恢复—MYSQL数据库ibdata1文件损坏的数据恢复案例

    mysql数据库故障: mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用my
    的头像 发表于 12-09 11:05 352次阅读

    香港云服务器怎么部署MySQL数据库

    在香港云服务器上部署MySQL数据库的步骤如下: 步骤 1: 更新软件包列表 首先,确保软件包列表是最新的。在终端执行以下命令: sudo apt update 步骤 2: 安装 MySQL
    的头像 发表于 11-14 16:15 337次阅读

    MySQL性能优化浅析及线上案例

    手段则会对用户的使用体验造成影响,严重的则会直接导致订单、金额直接受损,因而就需要时刻关注数据库的性能问题。 2、 性能优化的几个常见措施 数据库性能优化的常见手段有很多,比如添加索引
    的头像 发表于 10-22 15:17 863次阅读
    <b class='flag-5'>MySQL</b>性能<b class='flag-5'>优化</b>浅析及线上案例

    华纳云:MySQL初始化操作如何创建新的数据库

    要在MySQL创建一个新的数据库,可以按照以下步骤进行操作: 登录到MySQL数据库管理系统
    的头像 发表于 09-04 14:30 390次阅读

    软件系统数据库分库设计

    的分布式集群,实现分库表功能,解决数据库中海量数据存储和查询性能的问题。MyCat 还是一个数据库的集群中间件,主要实现 RDBMS
    的头像 发表于 08-22 11:39 429次阅读
    软件系统<b class='flag-5'>数据库</b>的<b class='flag-5'>分库</b><b class='flag-5'>分</b><b class='flag-5'>表</b>设计

    分库后复杂查询的应对之道:基于DTS实时性ES宽构建技术实践

    1 问题域 业务发展的初期,我们的数据库架构往往是单,外加读写分离来快速的支撑业务,随着用户量和订单量的增加,数据库的计算和存储往往会成为我们系统的瓶颈,业界的实践多数采用分而治
    的头像 发表于 06-25 18:30 1050次阅读
    <b class='flag-5'>分库</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后复杂查询的应对之道:基于DTS实时性ES宽<b class='flag-5'>表</b>构建技术实践