随笔分类 -  MySQL实战45讲

摘要:有这样一个问题:主机内存只有100G,现在要对一个200G的大表做全表扫描,会不会把数据库主机的内存用完?想想逻辑备份,也是整库扫描,因此对大表做全表扫描看起来是没有问题的,那么这个流程到底是怎样呢? 全表扫描对server层的影响 假设现在要对一个200G的InnoDB表db1.t执行全表扫描,若 阅读全文
posted @ 2025-10-04 16:56 叁沐 阅读(114) 评论(0) 推荐(0)
摘要:MySQL有两个kill命令: kill query+线程id,表示终止该线程正在执行的语句; kill (connection)+线程id,表示断开这个线程的连接,如果线程有语句正在执行,会先停止正在执行的语句。 有时候可能会遇到:使用了kill,却没能断开该连接,再执行show processl 阅读全文
posted @ 2025-09-20 18:39 叁沐 阅读(233) 评论(0) 推荐(2)
摘要:传统的高可用架构不能预防误删数据的,因为主库的一个drop table命令,会通过binlog传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。 MySQL相关误删数据主要有以下几种可能: 使用delete语句误删数据行; 使用drop table或truncate table语句误删 阅读全文
posted @ 2025-09-06 14:29 叁沐 阅读(329) 评论(0) 推荐(0)
摘要:首先复习一下加锁规则: 原则1:加锁的基本单位是next-key lock,是一个前开后闭区间; 原则2:查找过程中访问到的对象才会加锁; 优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁; 优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,n 阅读全文
posted @ 2025-08-31 21:07 叁沐 阅读(150) 评论(0) 推荐(1)
摘要:之前的文章已经说过:在一主一备的双M架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。 主备切换有两种场景,分别是主动切换和被动切换,其中被动切换往往是因为主库出问题由HA系统发起。那么怎么判断主库出问题了呢? selec 阅读全文
posted @ 2025-08-30 17:44 叁沐 阅读(212) 评论(0) 推荐(0)
摘要:读写分离的基本结构: 上图的结构是客户端主动做负载均衡,这种模式下一般会把数据库连接信息放在客户端的连接层,由客户端选择后端数据库进行查询。 还有一种架构是在MySQL和客户端间加入中间代理层proxy,客户端只连接proxy,由proxy根据请求类型和上下文决定请求的分发路线: 比较这两种架构: 阅读全文
posted @ 2025-08-24 09:11 叁沐 阅读(236) 评论(0) 推荐(1)
摘要:基本的一主多从结构: 图中,A和A'互为主备,从库BCD指向主库A。一主多次的设置,一般用于读写分离,主库负责所有的写入和一部分读,从库负责其他的读请求。 当主库发生故障,主备切换: 一主多从结构在切换完成后,A'会成为新主库,从库需要改接到A',而这个过程会增加主备切换的复杂度。接下来,就看看切换 阅读全文
posted @ 2025-08-23 12:20 叁沐 阅读(212) 评论(0) 推荐(0)
摘要:上一篇文章介绍的场景中,对备库延迟的影响一般是分钟级的。但如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就可能成了小时级别。这就涉及今天介绍的话题:备库并行复制能力。 主备流程图: 主备的并行复制能力主要是上图的两个黑色箭头,一个箭头代表客户端写入主库,另一个箭头代表备库上sql_th 阅读全文
posted @ 2025-08-10 18:54 叁沐 阅读(324) 评论(0) 推荐(0)
摘要:正常情况下,只要主库执行更新生成的所有binlog,都可以被传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性,而MySQL要提供的高可用能力,只有最终一致性是不够的。 主备延迟 主备切换可能是一个主动运维动作,比如软件升级、主库所在机器按计划下线等,也可能是被动操作,比如主库所 阅读全文
posted @ 2025-08-09 11:16 叁沐 阅读(293) 评论(0) 推荐(0)
摘要:MySQL主备的基本原理 状态1中,客户端读写都是直接访问节点A,节点B只是将节点A的更新同步过来在本地执行。当需要主备切换时,就变成状态2。 状态1中没有直接访问节点B,但仍然建议把节点B设置成只读模式,原因如下: 有时一些运营类的查询语句会被放到备库上查看,设置为只读可以防止误操作; 防止切换逻 阅读全文
posted @ 2025-08-03 14:58 叁沐 阅读(354) 评论(0) 推荐(0)
摘要:只要redo log和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。本文讲讲MySQL写入binlog和redo log的流程。 binlog的写入机制 binlog的写入逻辑比较简单:事务在执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlo 阅读全文
posted @ 2025-08-02 09:12 叁沐 阅读(293) 评论(0) 推荐(1)
摘要:有时候,在业务高峰期,生产环境的MySQL压力太大,没法正常响应,需要短期内、临时性地提升一些性能。本文就来讲讲一些临时方法,并着重说它们可能存在的风险。 短连接风暴 正常的短连接模式是连接到数据库后,执行很少的SQL语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰期时,可能出现连接 阅读全文
posted @ 2025-07-26 11:53 叁沐 阅读(356) 评论(0) 推荐(0)
摘要:上篇文章中,介绍了间隙锁和临键锁,但并未说明加锁规则。本文首先介绍加锁规则,由于间隙锁在可重复读隔离级别下才有效,因此接下来的内容默认在可重复读隔离级别下。 加锁规则(限5.x系列<=5.7.24, 8.0系列<=8.0.13): 原则1:加锁的基本单位是临键锁,是一个前开后闭区间; 原则2:查找过 阅读全文
posted @ 2025-07-24 20:15 叁沐 阅读(514) 评论(0) 推荐(0)
摘要:首先给出要用到的数据: CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`) ) ENGINE=I 阅读全文
posted @ 2025-07-22 20:45 叁沐 阅读(416) 评论(0) 推荐(0)
摘要:有些情况下,“查一行”也会执行特别慢,今天就看看什么情况会出现这个现象。 如果MySQL本身有很大压力,导致数据库服务器CPU占有率很高或IO利用率很高,这种情况所有语句的执行都可能变慢,不在本文讨论范围内。 为了分析,构建有10万行记录的表,建表语句如下: CREATE TABLE `t` ( ` 阅读全文
posted @ 2025-07-21 11:11 叁沐 阅读(593) 评论(0) 推荐(1)
摘要:在MySQL中,有很多看上去逻辑相同,但性能差异巨大的SQL语句。对这些语句使用不当的话,就会不经意导致整个数据库压力变大。本文选择了三个这样的案例。 案例一:条件字段函数操作 假设现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator) 阅读全文
posted @ 2025-07-20 18:51 叁沐 阅读(468) 评论(0) 推荐(1)
摘要:假设有一个场景,一个英语学习APP首页有一个随机显示单词的功能,用户每次访问首页的时候,都会随机滚动显示三个单词。 已知表里有10000条记录,来看看随机选择3个单词有什么方法,又存在什么问题。 建表语句: mysql> CREATE TABLE `words` ( `id` int(11) NOT 阅读全文
posted @ 2025-07-19 15:24 叁沐 阅读(435) 评论(0) 推荐(2)
摘要:假设要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名与年龄。那么SQL语句可以写为: select city,name,age from t where city='杭州' order by name limit 1000; 本文主要想讨论这个语句是如何执行的,以及有什么参 阅读全文
posted @ 2025-07-17 17:28 叁沐 阅读(373) 评论(0) 推荐(1)
摘要:先放一下两阶段提交的图,在后续问题中会用到: 问题 在MySQL 02中,讲到为什么要使用两阶段提交时用的是反证法,说明了如果不使用两阶段提交,会导致MySQL出现主备数据不一致等问题。 那么如果在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的呢? 如果在图中时刻A,也就是 阅读全文
posted @ 2025-07-16 18:54 叁沐 阅读(304) 评论(0) 推荐(0)
摘要:count(*)的实现方式 在不同的MySQL引擎中,count(*)有不同的实现方式: MyISAM引擎把一个表的总行数存在磁盘上,执行count(*)时能直接返回总行数,效率很高; InnoDB引擎需要把数据一行一行从引擎里读出来,然后累积计数。 需要说明,本文讨论没有过滤条件的count(*) 阅读全文
posted @ 2025-07-14 12:33 叁沐 阅读(888) 评论(5) 推荐(2)

//雪花飘落效果