图解MySQL
文章平均质量分 93
小林coding
公众号 : 「小林coding」 专注图解计算机基础,期待你的关注,保证把你图解的明明白白。
展开
-
执行 select ... for update 语句,如果查询条件没有索引字段的话,是加行锁还是加表锁?
很有争议的问题原创 2022-12-18 16:37:12 · 5947 阅读 · 9 评论 -
MySQL 的 NULL 是怎么存储的?
大家好,我是小林。之前有位读者在面字节的时候,被问到这么个问题:如果你知道 MySQL 一行记录的存储结构,那么这个问题对你没什么难度。如果你不知道也没关系,这次我跟大家聊聊 MySQL 一行记录是怎么存储的?知道了这个之后,除了能应解锁前面这道面试题,你还会解锁这些面试题:原创 2022-12-01 14:09:10 · 3854 阅读 · 6 评论 -
MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?
是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,一会是 next-key 锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加了什么类型的行级锁。原创 2022-11-14 12:08:35 · 2130 阅读 · 1 评论 -
MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
大家好,我是小林。最近重新补充些内容,所以,现在内容还是比较全面的,基本把 MySQL 用到的锁都说了一遍,大家可以在复习复习。原创 2022-10-24 10:33:10 · 2015 阅读 · 0 评论 -
MySQL 单表不要超过 2000W 行,靠谱吗?
但是在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到 User Records 部分,当 Free Space 部分的空间全部被 User Records 部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了。但是叶子节点中存放的是真正的行数据,这个影响的因素就会多很多,比如,字段的类型,字段的数量。转载 2022-09-11 17:20:01 · 1559 阅读 · 0 评论 -
MySQL 可重复读隔离级别,解决幻读了吗?
翻译:当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。MySQL 是怎么解决幻读的?针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。原创 2022-09-11 17:09:55 · 2050 阅读 · 0 评论 -
2 万字 + 30 张图 |MySQL 日志:undo log、redo log、binlog 有什么用?
大家好,我是小林。从这篇「执行一条 SQL 查询语句,期间发生了什么?」中,我们知道了一条查询语句经历的过程,这属于「读」一条记录的过程,如下图:那么,执行一条 update 语句,期间发生了什么?,比如这一条 update 语句:查询语句的那一套流程,更新语句也是同样会走一遍:不过,更新语句的流程会涉及到 undo log(回滚日志)、redo log(重做日志) 、binlog (归档日志)这三种日志:所以这次就带着这个问题,看看这三种日志是怎么工作的。我们在执行执行一条“增删改”语句的时候,虽然没原创 2022-06-21 13:07:26 · 2543 阅读 · 1 评论 -
什么是MySQL 事务与 MVCC 原理?
作者:小林coding图解计算机基础网站:https://xiaolincoding.com/大家好,我是小林。之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候,评论区指出了一些问题。而这个知识点很重要,面试太常问了,所以,我就重写了这篇文章!开车!正文这是我的钱包,共有 100 万元。今天我心情好,我决定给你的转账 100 万,最后的结果肯定是我的余额变为 0 元,你的余额多了 100 万元,是不是想到就很开心?转账这一动作在程序里会涉及到一系列的..原创 2022-04-01 10:34:16 · 4145 阅读 · 6 评论 -
趣说 | 数据库和缓存如何保证一致性?
数据库和缓存如何保证一致性?一天,老板说「最近公司的用户越来越多了,但是服务器的访问速度越来越差的,阿旺帮我优化下,做好了给你画个饼!」。程序员阿旺听到老板口中的「画饼」后就非常期待,没有任何犹豫就接下了老板给的这个任务。阿旺登陆到了服务器,经过一番排查后,确认服务器的性能瓶颈是在数据库。这好办,给服务器加上 Redis,让其作为数据库的缓存。这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能。先更新数据库,还是先更新缓存原创 2022-03-31 11:01:06 · 3756 阅读 · 2 评论 -
MySQL 的 Buffer Pool,终于被我搞懂了
大家好,我是小林。今天就聊 MySQL 的 Buffer Pool,发车!为什么要有 Buffer Pool?虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。要想提升查询性能,加个缓存就行了嘛。所以,当数据从磁盘中取出后,缓存内存中,下次查询同样的数据的时候,直接从内存中读取。为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。有了缓冲池后:当读取数据时,如果数据存在于 Buffer Pool原创 2022-03-25 22:38:54 · 7355 阅读 · 2 评论 -
MySQL 死锁了,怎么办?
大家好,我是小林。说个很早之前自己遇到过数据库死锁问题。有个业务主要逻辑就是新增订单、修改订单、查询订单等操作。然后因为订单是不能重复的,所以当时在新增订单的时候做了幂等性校验,做法就是在新增订单记录之前,先通过 select ... for update 语句查询订单是否存在,如果不存在才插入订单记录。而正是因为这样的操作,当业务量很大的时候,就可能会出现死锁。接下来跟大家聊下为什么会发生死锁,以及怎么避免死锁。死锁的发生本次案例使用存储引擎 Innodb,隔离级别不可重复读(RR)。接下来原创 2022-03-12 18:24:26 · 4209 阅读 · 0 评论 -
面试官:MySQL 是怎么加锁的?
MySQL 是怎么加锁的?大家好,我是小林。在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁,其中行级锁只提了概念,并没有具体说。因为行级锁加锁规则比较复杂,不同的场景,加锁的形式还不同,所以这次就来好好介绍下行级锁。对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。但是,next-key lock 在一些场景下会退化成记录锁或间隙锁。那到底是什么场景呢?今天,我们就以下面这原创 2022-03-12 18:18:57 · 5422 阅读 · 1 评论 -
为什么 MySQL 采用 B+ 树作为索引?
大家好,我是小林。「为什么 MySQL 采用 B+ 树作为索引?」这句话,是不是在面试时经常出现。要解释这个问题,其实不单单要从数据结构的角度出发,还要考虑磁盘 I/O 操作次数,因为 MySQL 的数据是存储在磁盘中的嘛。这次,就跟大家一层一层的分析这个问题,图中包含大量的动图来帮助大家理解,相信看完你就拿捏这道题目了!怎样的索引的数据结构是好的?MySQL 的数据是持久化的,意味着数据(索引+记录)是保存到磁盘上的,因为这样即使设备断电了,数据也不会丢失。磁盘是一个慢的离谱的存储设备,有多原创 2022-03-12 17:58:37 · 3327 阅读 · 2 评论 -
MySQL 使用 like “%x“,索引一定会失效吗?
大家好,我是小林。昨天发了一篇关于索引失效的文章:谁还没碰过索引失效呢我在文末留了一个有点意思的思考题:这个思考题其实是出自于,我之前这篇文章「一条 SQL 语句引发的思考」中留言区一位读者朋友出的问题。很多读者都在留言区说了自己的想法,也有不少读者私聊我答案到底是什么?所以,我今晚就跟大家聊聊这个思考题。题目一题目一很简单,相信大家都能分析出答案,我昨天分享的索引失效文章里也提及过。**「题目 1 」**的数据库表如下,id 是主键索引,name 是二级索引,其他字段都是非索引字段。原创 2022-01-25 16:38:50 · 8330 阅读 · 12 评论 -
聊聊索引失效?失效的原因是什么?
大家好,我是小林。在工作中,如果我们想提高一条语句查询速度,通常都会想对字段建立索引。但是索引并不是万能的。建立了索引,并不意味着任何查询语句都能走索引扫描。稍不注意,可能你写的查询语句是会导致索引失效,从而走了全表扫描,虽然查询的结果没问题,但是查询的性能大大降低。今天就来跟大家盘一盘,常见的 6 种会发生索引失效的场景。不仅会用实验案例给大家说明,也会清楚每个索引失效的原因。发车!索引存储结构长什么样?我们先来看看索引存储结构长什么样?因为只有知道索引的存储结构,才能更好的理解索引失效原创 2022-01-24 13:27:13 · 6528 阅读 · 3 评论 -
MySQL 中 count(*) 和 count(1) 有什么区别?哪个性能最好?
大家好,我是小林。当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。到底哪种效率是最好的呢?是不是 count(*) 效率最差?我曾经以为 count(*) 是效率最差的,因为认知上 selete * from t 会读取所有表中的字段,所以凡事带有 * 字符的就觉得会读取表中所有的字段,当时网上有很多博客也这么说。但是,当我深入 count 函数的原理后,被啪啪原创 2022-01-06 09:15:05 · 26988 阅读 · 20 评论 -
从 MySQL 数据页的角度看 B+ 树
大家好,我是小林。大家背八股文的时候,都知道 MySQL 里 InnoDB 存储引擎是采用 B+ 树来组织数据的。这点没错,但是大家知道 B+ 树里的节点里存放的是什么呢?查询数据的过程又是怎样的?这次,我们从数据页的角度看 B+ 树,看看每个节点长啥样。InnoDB 是如何存储数据的?MySQL 支持多种存储引擎,不同的存储引擎,存储数据的方式也是不同的,我们最常使用的是 InnoDB 存储引擎,所以就跟大家图解下InnoDB 是如何存储数据的。记录是按照行来存储的,但是数据库的读取并不以「原创 2021-12-20 14:14:12 · 3701 阅读 · 0 评论 -
MySQL的幻读是怎么被解决的?
大家好,我是小林。我之前写过一篇数据库事务的文章「 事务、事务隔离级别和MVCC」,这篇我说过什么是幻读。然后前几天有位读者跟我说,我这个幻读例子不是已经被「可重复读」隔离级别解决了吗?为什么还要有 next-key 呢?他有这个质疑,是因为他做了这个实验。实验的数据库表 t_stu 如下,其中 id 为主键。然后在可重复读隔离级别下,有两个事务的执行顺序如下:从这个实验结果可以看到,即使事务 B 中途插入了一条记录,事务 A 前后两次查询的结果集都是一样的,并没有出现所谓的幻读现象。读原创 2021-09-18 13:41:44 · 4659 阅读 · 4 评论 -
完蛋,公司被一条 update 语句干趴了!
大家好,我是小林。昨晚在群划水的时候,看到有位读者说了这么一件事。大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩了,被老板教训了一波这次我们就来看看:为什么会发生这种的事故?又该如何避免这种事故的发生?说个前提,接下来说的案例都是基于 InnoDB 存储引擎,且事务的隔离级别是可重复读。为什么会发生这种的事故?InnoDB 存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问原创 2021-09-12 12:47:06 · 5899 阅读 · 4 评论 -
MySQL 有哪些锁?
大家好,我是小林。这次,来说说 MySQL 的锁,主要是 Q&A 的形式,看起来会比较轻松。不多 BB 了,发车!在 MySQL 里,根据加锁的范围,可以分为全局锁、表级锁和行锁三类。全局锁全局锁是怎么用的?要使用全局锁,则要执行这条命:flush tables with read lock执行后,整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞:对数据的增删查改操作,比如 select、insert、delete、update等语句;对表结构的更改操作原创 2021-08-16 11:22:32 · 12236 阅读 · 9 评论