从0开始回顾MySQL---系列八

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 分库分表1、为什么要分库分表?1. 数据库中的数据量不一定是可控的,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地数据操作,例如 增删改查的开销 也会越来越大;另外,若不进行分布式部署,而一台服务器的 资源 (CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。2. 所以,从 性能 和 可用性 角度考虑,会进行数据库拆分处理,具体地说,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上,即 分库分表。2、分库分表的具体实施策略分库分表有 垂直切分 和 水平切分 两种方式,在

分库分表

1、为什么要分库分表?


  1. 数据库中的数据量不一定是可控的,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地数据操作,例如 增删改查的开销 也会越来越大;另外,若不进行分布式部署,而一台服务器的 资源 (CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
  2. 所以,从 性能可用性 角度考虑,会进行数据库拆分处理,具体地说,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上,即 分库分表


2、分库分表的具体实施策略


分库分表有 垂直切分水平切分 两种方式,在复杂的业务场景中,也可能会选择两者结合的方式。

切分方式

定义

优点

缺点

应用场景

垂直切分

数据表 的拆分,把一张列比较多的表拆分为多张表,具体地,根据数据库里面数据表的相关性进行拆分

可以使行数据变小,在查询时减少读取的 Block 数,减少 I/O 次数;简化表结构,更易于维护

主键会出现冗余,需要管理冗余列;会引起 JOIN 操作;加大事务管理的难度

适合 表多 且 各项 业务逻辑 划分清晰、低耦合情景

水平切分

数据表 的拆分,是一种横向按业务维度切分的方式,保持数据表结构不变,通过某种策略存储数据分片

可支持非常大的数据量存储;应用端改造少

分片事务难以解决;会增加逻辑、部署、应用和运维的各种复杂度

水平拆分更适合进行 分库 或者 单表数据量大 且表中的数据本身就有独立性

3、分库分表存在哪些问题


进行分库分表操作后,可能会面临以下几类问题:

  • 事务问题:分库分表后,就成了分布式事务。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
  • 跨库跨表的 JOIN 问题
    在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法 JOIN 位于不同分库的表,也无法 JOIN 分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。
  • 额外的数据管理负担和数据运算压力
    额外的数据管理负担,最为常见的是数据的 定位问题 和数据的 增删改查 的重复执行问题,这些都可以通过应用程序来解决,但必然会引起额外的逻辑运算。
  • ID 问题
  • 数据库表被切分后,不能再依赖数据库⾃⾝的主键生成机制,所以需要⼀些手段来保证全局主键唯⼀。

主从复制

1、什么是 MySQL 主从复制?


  • 主从复制使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。  
  • MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。

2、MySQL主从同步的优点?


  1. 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  2. 提高数据安全,可以在从服务器上备份而不破坏主服务器相应数据。
  3. 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能 ;
  4. 数据备份


3、如何实现MySQL的读写分离?

读写分离的基本原理是将数据库读写操作分散到不同的节点上,下⾯是基本架构图:

读写分离的基本实现是:

  • 数据库服务器搭建主从集群,⼀主⼀从、⼀主多从都可以。
  • 数据库主机负责读写操作,从机只负责读操作。
  • 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。
  • 业务服务器将写操作发给数据库主机,将读操作发给数据库从机。

4、MySQL主从复制流程和原理?


基本原理流程,是3个线程以及之间的关联:

  • :binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
  • :io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;
  • :sql执行线程——执行relay log中的语句;

复制过程如下

  • 第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
  • 第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump  process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
  • 第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。

  • Binary log:主数据库的二进制日志;
  • Relay log:从服务器的中继日志;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
从0开始回顾MySQL---系列三
索引 1、没有索引如何查找数据? 在一个页中的查找,分为两种情况: 以主键为搜索条件 可以在 页目录 中使用二分法快速定位到对应的槽,然后再遍历该槽对应 分组中的记录即可快速找到指定的记录。 以其他列作为搜索条件 对非主键列的查找的过程可就不这么幸运了,因为在数据页中并没有对非主键列建立所谓的 页目录 ,所以 我们无法通过二分法快速定位相应的 槽 。这种情况下只能从 最小记录 开始依次遍历单链表中的每条记录, 然后对比每条记录是不是符合搜索条件。很显然,这种查找的效率是非常低的。 在很多页中的查找,可以分为两个步骤: 定位到记录所在的页。 从所在的页内中查找相应的记录。 在没有索引的情
|
6月前
|
SQL 存储 关系型数据库
Mysql的NULLIF
Mysql的NULLIF
61 1
|
6月前
|
存储 关系型数据库 MySQL
从0开始回顾MySQL---系列一
基础 1、数据库的三范式是什么? 数据库范式是设计数据库时,需要遵循的一些规范。各种范式是条件递增的联系,越高的范式数据库冗余越小。常用的数据库三大范式为: 1. 第一范式(1NF):每个列都不可以再拆分,强调的是列的原子性,即数据库表的每一列都是不可分割的原 子数据项。 2. 第二范式(2NF):在满足第一范式的基础上,非主属性完全依赖于主码(主关键字、主键),消除非主属性对主码的部分函数依赖。 3. 第三范式(3NF):在满足第二范式的基础上,表中的任何属性不依赖于其它非主属性,消除传递依赖。简而言之,非主键都直接依赖于主键,而不是通过其它的键来间接依赖于主键。 2、MySQL 支持哪
|
6月前
|
存储 SQL 关系型数据库
从0开始回顾MySQL---系列五
事务 1、什么是数据库事务? 事务(Transaction)是访问和更新数据库的程序执行单元,是逻辑上的一组操作,要么都执行,要么都不执行。如果任意一个操作失败,那么整组操作即为失败,会回到操作前状态或者是上一个节点。 因此,事务是保持 逻辑数据一致性 和 可恢复性 的重要利器。而锁是实现事务的关键,可以保证事务的完整性和并发性。 事务控制语句: ● BEGIN 或 START TRANSACTION 显式地开启一个事务; ● COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的; ● ROLLBAC
|
6月前
|
存储 SQL 关系型数据库
从0开始回顾MySQL---系列四
9、什么是回表(使用索引查询完整数据过程)? 当我们需要查询一条完整的数据的时候: ● 如果是通过聚簇索引来查询数据,例如 select * from user where id=100,那么此时只需要搜索聚簇索引的 B+Tree 就可以找到数据。 ● 如果是通过非聚簇索引来查询数据,例如 select * from user where username=zhangsan',那么此时需要先搜索 username 这一列索引的 B+树,搜索完成后得到主键的值,然后再去搜索聚簇索引的 B+树,就可以获取到一行完整的数据。 对于第二种查询方式而言,一共搜索了两棵 B+树,第一次搜索 B+树 拿到
|
6月前
|
存储 关系型数据库 MySQL
从0开始回顾MySQL---系列六
11、什么是MVCC? MVCC 全称 Multi-Version Concurrency Control,即多版本并发控制,用来解决读写冲突的无锁并发控制,可以在发生读写请求冲突时不用加锁解决,这个读是指的快照读(也叫一致性读或一致性无锁读),而不是当前读: ● 快照读:实现基于 MVCC,因为是多版本并发,所以快照读读到的数据不一定是当前最新的数据,有可能是历史版本的数据; ● 当前读:读取数据库记录是当前最新的版本(产生幻读、不可重复读),可以对读取的数据进行加锁,防止其他事务修改数据,是悲观锁的一种操作,读写操作加共享锁或者排他锁和串行化事务的隔离级别都是当前读。 -- 简单的sel
|
6月前
|
SQL 关系型数据库 MySQL
从0开始回顾MySQL---系列九
SQL优化 1、一条sql语句执行很慢的原因有哪些? ⚡ 一个SQL执行的很慢,我们要分两种情况讨论: 1. 大多数情况下很正常,偶尔很慢,则有如下原因: ● 数据库在刷新脏页(内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页),例如redo log 写满了需要同步到磁盘。 ● 执行的时候,遇到锁,如表锁、行锁。 ● sql语句写的不好。 2. 这条SQL语句一直执行的很慢,则有如下原因: ● 没有用上索引或者索引失效:比如该字段没有索引,由于对字段进行运算、函数操作导致无法用索引。 ● 有索引可能会走全表扫描: ○ 怎样判断是否走全表扫描? ○ 某
|
6月前
|
存储 缓存 关系型数据库
从0开始回顾MySQL---系列二
InnoDB记录结构 1、InnoDB行格式 ? ● 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 ● 设计InnoDB 存储引擎的作者到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、Redundant 、Dynamic 和 Compressed 行格式。 2、COMPACT行格式 ? 一条完整的记录其实可以被分为 记录的额外信息 和 记录的真实数据 两大部分。 记录的额外信息 这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些额外信息分为3类,分别是 变长字段长度列表 、 NULL值列表 和
|
6月前
|
存储 关系型数据库 MySQL
从0开始回顾MySQL---系列七
锁 1、为什么要加锁? 1. 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 2. 因此加锁是为了在多用户环境下保证数据库完整性和一致性。 2、MySQL都有哪些锁呢? 锁的分类: ● 按操作分类: ○ 共享锁:也叫读锁。对同一份数据,多个事务读操作可以同时加锁而不互相影响 ,但不能修改数据 ○ 排他锁:也叫写锁。当前的操作没有完成前,会阻断其他操作的读取和写入 ● 按粒度分类: ○ 表级锁:会锁定整个表,开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并
|
存储 SQL JSON
MySQL学习---17、MySQL8其它新特性
MySQL学习---17、MySQL8其它新特性
下一篇
无影云桌面