文章分类 - 数据库
摘要:简介: 秒杀最早来自天猫双11各种商品的促销活动中,现在已经有很多业务场景在使用,比如抢红包,抢票等。其特点有三高:瞬时并发高,数据一致性高,热点更新频度高。这样三高的场景下往往给数据库造成极大的压力,大量更新数据库中的同一行,这样必然会产生锁等待,导致数据库的性能急剧下降的问题,很容出现雪崩效应。
阅读全文
摘要:在上一篇文章最后,我给你留了一个关于加锁规则的问题。今天,我们就从这个问题说起吧。 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。建表和初始化语句如下(为了便于本期的例子说明,我把上篇文章中用到的表结构做了点儿修改): CREATE TABLE `t` ( `id` int(11) N
阅读全文
摘要:我在第25和27篇文章中,和你介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双M架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。 主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切
阅读全文
摘要:内存结构主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大组件。 缓冲池(Buffer Pool): Buffer Pool以Page为单位,默认大小16K,底层采用链表数据结构管理Page。 在InnoDB访问表记录和索引时
阅读全文
摘要:在上一篇文章中,我和你介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题。 我们在上一篇文章中提到的一主多从的结构,其实就是读写分离的基本结构了。这里,我再把这张图贴过来,方便你理解。 图1 读写分离基本结构 读写分离的主要目
阅读全文
摘要:在前面的第24、25和26篇文章中,我和你介绍了MySQL主备复制的基础结构,但这些都是一主一备的结构。 大多数的互联网应用场景都是读多写少,因此你负责的业务,在发展过程中很可能先会遇到读性能的问题。而在数据库层解决读性能问题,就要涉及到接下来两篇文章要讨论的架构:一主多从。 今天这篇文章,我们就先
阅读全文
摘要:在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因。你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。 但是,如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主
阅读全文
摘要:在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行。 正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL要提供高可用能力,只有最终一致性是不够的。
阅读全文
摘要:在前面的文章中,我不止一次地和你提到了binlog,大家知道binlog可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了binlog就可以跟主库保持一致了呢?今天我就正式地和你介绍一下它。 毫不夸张地说,MySQL能够成为现下最流行的开源数据库,binlog功不可没。 在
阅读全文
摘要:我经常会被问到这样一个问题:我的主机内存只有100G,现在要对一个200G的大表做全表扫描,会不会把数据库主机的内存用光了? 这个问题确实值得担心,被系统OOM(out of memory)可不是闹着玩的。但是,反过来想想,逻辑备份的时候,可不就是做整库扫描吗?如果这样就会把内存吃光,逻辑备份不是早
阅读全文
摘要:在MySQL中有两个kill命令: 一个是kill query +线程id,表示终止这个线程中正在执行的语句; 一个是kill connection +线程id,这里connection可缺省,表示断开这个线程的连接,当然如果这个线程有语句正 在执行,也是要先停止正在执行的语句的。 不知道你在使用M
阅读全文
摘要:今天我要和你讨论的是一个沉重的话题:误删数据。 在前面几篇文章中,我们介绍了MySQL的高可用架构。当然,传统的高可用架构是不能预防误删数据的,因为主库的一个drop table命令,会通过binlog传给所有从库和级联从库,进而导致整个集群的实例 都会执行这个命令。 虽然我们之前遇到的大多数的数据
阅读全文
摘要:在第16和第34篇文章中,我分别和你介绍了sort buffer、内存临时表和join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助SQL语句的执行的。其中,我们在排序的时候用到了sort buffer,在使用join语句的时候用到了 join buffer。 然后,你可
阅读全文
摘要:我在上一篇文章末尾留给你的问题是:两个group by 语句都用了order by null,为什么使用内存临时表得到的语句结果里,0这个值在最后一行;而使用磁盘临时表得到的结果里,0这个值在第一行? 今天我们就来看看,出现这个问题的原因吧。 内存表的数据组织结构 为了便于分析,我来把这个问题简化一
阅读全文
摘要:在MySQL⾥⾯,grant语句是⽤来给⽤户赋权的。不知道你有没有⻅过⼀些操作⽂档⾥⾯提到,grant之后要⻢上跟着执⾏⼀个 flush privileges命令,才能使赋权语句⽣效。我最开始使⽤MySQL的时候,就是照着⼀个操作⽂档的说明按照这个顺序操作 的。 那么,grant之后真的需要执⾏fl
阅读全文
摘要:我经常被问到这样⼀个问题:分区表有什么问题,为什么公司规范不让使⽤分区表呢?今天,我们就来聊聊分区表的使⽤⾏ 为,然后再⼀起回答这个问题。 分区表是什么? 为了说明分区表的组织形式,我先创建⼀个表t: CREATE TABLE `t` ( `ftime` datetime NOT NULL, `c`
阅读全文
摘要:MySQL⾥有很多⾃增的id,每个⾃增id都是定义了初始值,然后不停地往上加步⻓。虽然⾃然数是没有上限的,但是在计算机 ⾥,只要定义了表示这个数的字节⻓度,那它就有上限。⽐如,⽆符号整型(unsigned int)是4个字节,上限就是2 -1。 既然⾃增id有上限,就有可能被⽤完。但是,⾃增id⽤完
阅读全文
摘要:引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。目前没有一篇全面的博客,
阅读全文
摘要:引言 我们先来讲一个段子 面试官:“有并发的经验没?”应聘者:“有一点。”面试官:“那你们为了处理并发,做了哪些优化?”应聘者:“前后端分离啊,限流啊,分库分表啊。。”面试官:"谈谈分库分表吧?"应聘者:“bala。bala。bala。。”面试官心理活动:这个仁兄讲的怎么这么像网上的博客抄的,容我再
阅读全文
摘要:引言 大家在面试的时候,是否遭遇过,面试官询问 你们是如何进行数据库优化的? 那这个问题应该怎么答呢?其实写这个题材的原因是我这几天看到各公众号转的一篇数据库调优的知识(不上链接了),我就稍微翻了几下,上面动不动就来说要对数据库进行水平拆分,我就想反问各位读者,你们几个人经历过水平拆分?现在很多文章
阅读全文