MySQL 案例:无主键表引发的同步延迟
时间:2022-07-24
本文章向大家介绍MySQL 案例:无主键表引发的同步延迟,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题表现
腾讯云的灾备实例,备库,只读实例等均出现巨大的同步延迟,表现如下:
binlog 落后的 size 可能是 0 或者比较小
按照如下方式找到主从延迟时间的监控,会看到主从延迟的时间不为 0,且表现为稳定上升的趋势。
而只读从库上又没有什么查询的话,有可能就是无主键、索引的表引起的主从延迟。
解决办法
推荐方案:趁着业务空闲期间,在主库上为表加上主键或者唯一索引,然后再重建受影响的灾备实例,备库,只读实例等。
可以使用如下的语句检查无主键的表:
select table_schema,table_name,TABLE_ROWS
from information_schema.tables
where (table_schema,table_name) not in
(select distinct table_schema,table_name
from information_schema.columns
where COLUMN_KEY='PRI')
and table_schema not in ('sys','mysql','information_schema','performance_schema')
and table_type='BASE TABLE';
主键可以使用自增列,也可以使用业务上具有唯一性的其他列。
例如:
alter table tmp1 add column id int unsigned not null AUTO_INCREMENT primary key before columnname;
PS:before 表的第一列,比较美观和符合常识的表结构写法。
问题分析
腾讯云数据库 MySQL 的 binlog 默认使用了 row 模式,binlog 会记录所有的数据变更,这意味着一个 update 或者 delete 语句如果修改了非常多的数据,那么每一行数据的变化都会记录到 binlog 中,最终会产生非常多的 binlog 日志。
从库在处理这些日志时,每一行数据的操作都会去尝试定位具体的数据,然后再判断是不是需要执行操作来完成数据变更。如果在某张大表上 update 或者 delete 一些数据,而这张表没有索引,那么定位数据的时候就会变成全表扫描,且 update 或者 delete 的每一行数据都会触发一次全表扫描,从库会产生非常大的延迟。
通过修改参数可能会加速追同步的速度,但是最好的办法还是加上主键或者唯一索引,索引搜索数据的效率还是远高于 HASH 算法的。
- 老域名新用的优缺点分析
- 不用临时变量,交换二个整型变量的值
- monoTouch开发(1):win7 + vmware下安装mac os
- 数据结构C#版笔记--队列(Quene)
- 数据结构C#版笔记--堆栈(Stack)
- MySQL基础入门-第一课 新建数据库(linux版本)
- 2017年度最不安全密码报告,看看你的密码安全吗?
- 数据结构C#版笔记--顺序表(SeqList)
- 数据结构C#版笔记--单链表(LinkList)
- 操作系统 页式存储 页与块之间的关系详解
- 数据结构C#版笔记--双向链表(DbLinkList)
- 斐波那契数列与IE9
- DateTime.ToString()输出"年/月/日 时:分:秒"的格式
- Flash在线拍摄用户头象
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 03 . MysSQL权限和备份
- 04 . Mysql主从复制和Mycat读写分离
- 02 . Python之数据类型
- 05 . k8s实战之部署PHP/JAVA网站
- 拖不得了,Android11真的来了,最全适配实践指南奉上
- 03 . Python入门之运算符
- 04 . Python入门之条件语句
- vue-element的select下拉框赋值
- 女儿拿着小天才电话手表问我App启动流程
- 数据库三问—快手真题
- 新人手册系列:思考篇-稳定性&大促保障
- RecycleView三问—腾讯真题
- css文字底部阴影效果
- 04 . kubernetes资源清单YAML入门
- 05 . Python入门值循环语句