MySQL主从复制与表拆分相关问题总结

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL主从复制与表拆分相关问题总结

文章参考:https://joonwhee.blog.csdn.net/article/details/106893197


问题:如何做慢 SQL 优化?


首先要搞明白慢的原因是什么:是查询条件没有命中索引?还是 load 了不需要的数据列?还是数据量太大?所以优化也是针对这三个方向来的:


首先用 explain 分析语句的执行计划,查看使用索引的情况,是不是查询没走索引,如果可以加索引解决,优先采用加索引解决。


分析语句,看看是否存在一些导致索引失效的用法,是否 load 了额外的数据,是否加载了许多结果中并不需要的列,对语句进行分析以及重写。


如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行垂直拆分或者水平拆分。


1. 水平拆分与垂直拆分

1.1 水平分表

例:QQ的登录表


假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢。如果将这一张表分成100份,每张表有1亿条,就小了很多,比如qq0,qq1,qq1...qq99表。


用户登录的时候,可以将用户的id%100,那么会得到0-99的数,查询表的时候,将表名qq + 取模的数连接起来,就构建了表名。比如123456789用户,取模的89,那么就到qq89表查询,查询的时间将会大大缩短。


1.2 垂直分表

垂直分割指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

例如:学生答题表student_question,有如下5个字段:


Id,name,分数,题目,回答。其中题目和回答是比较大的字段,Id,name,分数比较小。


如果我们只想查询id为8的学生的分数:select 分数 from tt where id = 8;


虽然只是查询分数,但是题目和回答这两个大字段也是要被扫描的,很消耗性能。然而我们只需要关心分数,并不想查询题目和回答。这种情况下就可以使用垂直分割。

我们可以把题目单独放到一张表中,通过id与tt表建立一对一的关系,同样将回答单独放到一张表中。这样我们查询student_question中的分数的时候就不会扫描题目和回答这两个大字段了。

1.3 小结

水平分割是表中数据量过大,严重影响查询效率时,将1张数据量庞大的表按照某种条件进行拆分成N张名称不同字段和数据类型相同的表。

垂直分割是表中记录数不多,但是字段很多,且字段长,表占用空间大的情况下,把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

2. 主从复制

参考文章:MySQL主从复制读写分离,看这篇就够了


2.1 MySQL主从复制介绍


MySQL主从复制涉及到三个线程,一个运行在主节点(Log Dump Thread),其余两个(I/O Thread,SQL Thread)运行在从节点,如下图所示


image.png


主从复制默认是异步的模式,具体过程如下:


从节点上的 I/O 线程连接主节点,请求读取主库的二进制日志文件(bin log 日志)的指定位置(bin log position)之后的日志内容;


主节点线程接收到来自从节点 I/O 线程的请求后,读取主节点中的二进制日志文件(bin log 日志)的指定位置之后的日志信息,返回给从节点。


返回给从节点的内容信息中除了日志所包含的信息之外,还包括本次返回的信息的 bin-log file(二进制日志文件) 以及 bin-log position(读取的位置);

从节点的 I/O 线程接收到内容后,将接收到的日志内容更新到 relay log (中继日志)中,并将读取到的 bin log file(文件名)和position(位置)保存到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master “我需要从某个bin-log 的哪个位置开始往后的日志内容”


从节点的 SQL 线程检测到 relay-log 中新增加了内容后,会解析 relay-log 的内容,并在本数据库中执行。



2.2 异步复制,主库宕机后,数据可能丢失?


可以使用半同步复制或全同步复制。


半同步复制:

修改语句写入bin log后,不会立即给客户端返回结果。而是首先通过log dump 线程将 binlog 发送给从节点,从节点的 I/O 线程收到 binlog 后,写入到 relay log,然后返回 ACK 给主节点,主节点 收到 ACK 后,再返回给客户端成功。


image.png

image.png

半同步复制的特点:


确保事务提交后 binlog 至少传输到一个从库,不保证从库应用完这个事务的 binlog。

性能有一定的降低,响应时间会更长。

网络异常或从库宕机,卡主主库,直到超时或从库恢复。

全同步复制:主节点和所有从节点全部执行了该事务并确认才会向客户端返回成功。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。


2.3 主库写压力大,从库复制很可能出现延迟?


可以使用并行复制(并行是指从库多个SQL线程并行执行 relay log),解决从库复制延迟的问题。


MySQL 5.7 中引入基于组提交的并行复制,其核心思想:一个组提交的事务都是可以并行回放,因为这些事务都已进入到事务的 prepare 阶段,则说明事务之间没有任何冲突(否则就不可能提交)。


判断事务是否处于一个组是通过 last_committed 变量,last_committed 表示事务提交的时候,上次事务提交的编号,如果事务具有相同的 last_committed,则表示这些事务都在一组内,可以进行并行的回放。




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 存储 关系型数据库
MySQL的主从复制&主从同步
MySQL的主从复制&主从同步
39 0
|
2月前
|
分布式计算 DataWorks 关系型数据库
DataWorks支持将ODPS表拆分并回流到MySQL的多个库和表中
【2月更文挑战第14天】DataWorks支持将ODPS表拆分并回流到MySQL的多个库和表中
62 8
|
2月前
|
SQL 关系型数据库 MySQL
MySQL主从复制
MySQL主从复制
35 0
|
5月前
|
SQL 关系型数据库 MySQL
面试官:说一下MySQL主从复制的原理?
面试官:说一下MySQL主从复制的原理?
102 0
面试官:说一下MySQL主从复制的原理?
|
1月前
|
关系型数据库 MySQL Java
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
39 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL中主从复制的原理和配置命令
要原因包括提高性能、实现高可用性、数据备份和灾难恢复。了解两大线程( I/O 和 SQL)I/O线程:目的:I/O线程主要负责与MySQL服务器之外的其他MySQL服务器进行通信,以便复制(replication)数据。 功能: 当一个MySQL服务器作为主服务器(master)时,I/O线程会将变更日志(binary log)中的事件传输给从服务器(slave)。从服务器上的I/O线程负责接收主服务器的二进制日志,并将这些事件写入本地的中继日志(relay log)。 配置: 在MySQL配置文件中,你可以通过配置参数如和来启用二进制日志和指定服务器ID。log-bin server
MySQL中主从复制的原理和配置命令
|
1月前
|
负载均衡 容灾 关系型数据库
mysql主从复制
mysql主从复制
44 1
|
2月前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
50 0
|
2天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
3天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构