2019年1月24日
摘要: 今天我要和你讨论的是一个沉重的话题:误删数据。 在前面几篇文章中,我们介绍了MySQL的高可用架构。当然,传统的高可用架构是不能预防误删数据的,因为主库的一个drop table命令,会通过binlog传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。 虽然我们之前遇到的大多数的数据被 阅读全文
posted @ 2019-01-24 13:27 杨三眼 阅读(1100) 评论(0) 推荐(0) 编辑
摘要: 在第20和21篇文章中,我和你介绍了InnoDB的间隙锁、next-key lock,以及加锁规则。在这两篇文章的评论区,出现了很多高质量的留言。我觉得通过分析这些问题,可以帮助你加深对加锁规则的理解。 所以,我就从中挑选了几个有代表性的问题,构成了今天这篇答疑文章的主题,即:用动态的观点看加锁。 阅读全文
posted @ 2019-01-24 13:26 杨三眼 阅读(954) 评论(0) 推荐(0) 编辑
摘要: 我在第25和27篇文章中,和你介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双M架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。 主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切 阅读全文
posted @ 2019-01-24 13:25 杨三眼 阅读(906) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题。 我们在上一篇文章中提到的一主多从的结构,其实就是读写分离的基本结构了。这里,我再把这张图贴过来,方便你理解。 读写分离的主要目标就是分摊主库的压力。图 阅读全文
posted @ 2019-01-24 13:24 杨三眼 阅读(5019) 评论(0) 推荐(0) 编辑
摘要: 在前面的第24、25和26篇文章中,我和你介绍了MySQL主备复制的基础结构,但这些都是一主一备的结构。 大多数的互联网应用场景都是读多写少,因此你负责的业务,在发展过程中很可能先会遇到读性能的问题。而在数据库层解决读性能问题,就要涉及到接下来两篇文章要讨论的架构:一主多从。 今天这篇文章,我们就先 阅读全文
posted @ 2019-01-24 13:23 杨三眼 阅读(1052) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因。你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。 但是,如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主 阅读全文
posted @ 2019-01-24 13:22 杨三眼 阅读(1069) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行。 正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL要提供高可用能力,只有最终一致性是不够的。 阅读全文
posted @ 2019-01-24 13:21 杨三眼 阅读(2050) 评论(0) 推荐(1) 编辑
摘要: 在前面的文章中,我不止一次地和你提到了binlog,大家知道binlog可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了binlog就可以跟主库保持一致了呢?今天我就正式地和你介绍一下它。 毫不夸张地说,MySQL能够成为现下最流行的开源数据库,binlog功不可没。 在 阅读全文
posted @ 2019-01-24 13:20 杨三眼 阅读(1807) 评论(0) 推荐(0) 编辑
摘要: 今天这篇文章,我会继续和你介绍在业务高峰期临时提升性能的方法。从文章标题“MySQL是怎么保证数据不丢的?”,你就可以看出来,今天我和你介绍的方法,跟数据的可靠性有关。 在专栏前面文章和答疑篇中,我都着重介绍了WAL机制(你可以再回顾下第2篇、第9篇、第12篇和第15篇文章中的相关内容),得到的结论 阅读全文
posted @ 2019-01-24 13:19 杨三眼 阅读(3627) 评论(0) 推荐(0) 编辑
摘要: 不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环境的MySQL压力太大,没法正常响应,需要短期内、临时性地提升一些性能。 我以前做业务护航的时候,就偶尔会碰上这种场景。用户的开发负责人说,不管你用什么方案,让业务先跑起来再说。 但,如果是无损方案的话,肯定不需要等到这个时候才上场。今 阅读全文
posted @ 2019-01-24 13:18 杨三眼 阅读(1179) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中,我和你介绍了间隙锁和next-key lock的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。 所以今天,我们就先从这个加锁规则开始吧。 首先说明一下,这些加锁规则我没在别的地方看到过有类似的总结,以前 阅读全文
posted @ 2019-01-24 13:17 杨三眼 阅读(2098) 评论(0) 推荐(0) 编辑
摘要: 一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下,“查一行”,也会执行得特别慢。今天,我就跟你聊聊这个有趣的话题,看看什么情况下,会出现这个现象。 需要说明的是,如果MySQL数据库本身就有很大的压力,导致数据库服务器CPU占用率很高或iou 阅读全文
posted @ 2019-01-24 13:16 杨三眼 阅读(2080) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章最后,我给你留了一个关于加锁规则的问题。今天,我们就从这个问题说起吧。 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。建表和初始化语句如下(为了便于本期的例子说明,我把上篇文章中用到的表结构做了点儿修改): 这个表除了主键id外,还有一个索引c,初始化语句在表中插入了6行数 阅读全文
posted @ 2019-01-24 13:16 杨三眼 阅读(1920) 评论(0) 推荐(1) 编辑
摘要: 在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。 我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。 案例一:条件字段函数操作 假设你现在维护了一个交易系统,其中交易记录表t 阅读全文
posted @ 2019-01-24 13:15 杨三眼 阅读(1028) 评论(0) 推荐(0) 编辑
摘要: 我在上一篇文章,为你讲解完order by语句的几种执行模式后,就想到了之前一个做英语学习App的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说MySQL中的另外一种排序需求,希望能够加深你对MySQL排序逻辑的理解。 这个英语学习App首页有一个随机显示单词的功能,也就是 阅读全文
posted @ 2019-01-24 13:13 杨三眼 阅读(937) 评论(0) 推荐(0) 编辑
摘要: 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。 假设这个表的部分定义是这样的: 这时,你的SQL语句可以这么写: 这个语句看上去逻辑很清晰,但是你了 阅读全文
posted @ 2019-01-24 13:12 杨三眼 阅读(1713) 评论(0) 推荐(0) 编辑
摘要: 在今天这篇答疑文章更新前,MySQL实战这个专栏已经更新了14篇。在这些文章中,大家在评论区留下了很多高质量的留言。现在,每篇文章的评论区都有热心的同学帮忙总结文章知识点,也有不少同学提出了很多高质量的问题,更有一些同学帮忙解答其他同学提出的问题。 在浏览这些留言并回复的过程中,我倍受鼓舞,也尽我所 阅读全文
posted @ 2019-01-24 13:11 杨三眼 阅读(1474) 评论(0) 推荐(0) 编辑
摘要: 在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要 阅读全文
posted @ 2019-01-24 13:10 杨三眼 阅读(6315) 评论(0) 推荐(0) 编辑
摘要: 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题。 这里,我们还是针对MySQL中应用最广泛的InnoDB引擎展开讨论。一个InnoDB表包含两部分,即:表结构定义和数据。在MyS 阅读全文
posted @ 2019-01-24 13:09 杨三眼 阅读(1331) 评论(0) 推荐(0) 编辑
摘要: 平时的工作中,不知道你有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。 看上去,这就像是数据库“抖”了一下。今天,我们就一起来看一看这是什么原因。 你的SQL语句为什么变“慢”了 在前面 阅读全文
posted @ 2019-01-24 13:08 杨三眼 阅读(1217) 评论(0) 推荐(0) 编辑