![](https://img-blog.csdnimg.cn/20210823104505526.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Mysql
文章平均质量分 92
Mysql
码上得天下
这个作者很懒,什么都没留下…
展开
-
MySQL 8.0 新特性解读(下)
作者:马文斌MySQL爱好者,任职于蓝月亮(中国)有限公司。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。上一篇主要讲了第一部分:功能增强,感兴趣的亲请点击【转载 2024-03-20 12:51:14 · 80 阅读 · 0 评论 -
MySQL 8.0 新特性解读(上)
目录1.1-所有系统表更换为InnoDB引擎1.2-DDL原子化1.3-DDL秒加列1.4-公用表表达式(CTE:Common Table Expression)1.5-默认字符集由latin1变为utf8mb41.6-Clone插件1.7-资源组1.8-角色管理1.9-多值索引1.10-函数索引1.11-不可见索引1.12-新增降序索引1.13-SET_VAR 语法1.14-参数修改持久化1.15-innodb select for update跳过锁等待1.16-group by 不再隐式排序1.17-转载 2024-03-19 22:30:33 · 256 阅读 · 0 评论 -
MySQL在线DDL原理
MDL锁,读读不互斥,读写、写写互斥。3. 我们常说的 Online DDL,其实是从 DML 操作的角度描述的,如果 DDL 操作不阻塞 DML 操作,那么这个 DDL 就是 Online 的。,在 5.6 的基础上又增加了一些新的特性,比如:增加了重命名索引支持,支持了数值类型长度的增大和减小,支持了 VARCHAR 类型的在线增大等。默认情况下,MySQL就是支持online的DDL操作的,在online的DDL语句执行的过程中,MySQL会尽量少使用锁的限制,我们不需要特殊的操作来启用它。转载 2024-03-19 19:48:23 · 169 阅读 · 0 评论 -
MySQL|什么情况下拓展字段长度会锁表?
如果修改字段的长度,导致字段的字节长度无法使用 1 byte表示,得使用2个byte才能表示,比如从 240 修改为 256 ,如果在默认字符集为utf8mb4的情况下,varchar(60) 修改为 varchar(64),则DDL需要以copy模式,也即会锁表,阻塞写操作。字符串的字段是以字节为单位存储的,utf8 一个字符需要三个字节,utf8mb4 一个字符需要4个字节。t1 表的字符集为utf8mb4,初始字段长度为20 ,80个字节,可以使用1byte表示。看看MySQL 官方文档。转载 2024-03-19 13:58:07 · 173 阅读 · 0 评论 -
Mysql8和Mysql5加锁规则的细微不同
范围查询,两者唯一索引和普通所以的规则还是一样的,区别在主键索引,对于原创 2024-03-17 21:30:26 · 885 阅读 · 0 评论 -
Mysql 死锁案例8-更新辅助索引与删除主键导致的死锁
死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。转载 2024-03-15 20:14:53 · 45 阅读 · 0 评论 -
Mysql 死锁案例7-并发更新索引列导致的死锁
事务1更新一个不存在的记录,锁住间隙事务2更新一个存在的记录的索引列,插入意向锁与事务1的间隙锁冲突阻塞事务1再更新一个存在的记录的索引列,意向插入锁与事务2的临键锁冲突转载 2024-03-14 11:30:59 · 80 阅读 · 0 评论 -
Mysql 死锁案例6-并发 insert on duplicate key 导致的死锁
mysql 5.7.12 ,事务隔离级别RRBEGIN;SHOW ENGINE INNODB STATUS 死锁日志。原创 2024-03-14 01:18:04 · 630 阅读 · 0 评论 -
Mysql 死锁案例5- 并发insert 唯一键冲突导致的死锁
死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。(以前案例都基于Mysql 5.7.12 事务级别RR)二 背景知识2.1 insert 锁机制在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略。我们先来看看官方定义:相信大部分的DBA同行都知道在事务执行insert的时候会申请一把插入意向锁(Insert Intention Lock)。转载 2024-03-13 23:18:25 · 311 阅读 · 0 评论 -
Mysql 死锁案例4-delete 相邻记录导致死锁
这里其实也是间隙锁和意向插入锁冲突死锁,delete与update加锁逻辑差不多。加了3把锁,索引c间隙锁(5,10),主键索引记录锁id=5,索引c临键锁(0,5]查看锁信息 SHOW ENGINE INNODB STATUS。注意where条件的c是普通索引。原创 2024-03-13 17:10:36 · 646 阅读 · 0 评论 -
MySQL数据页与B+树的关系
MySQL 一行记录是怎么存储的?MySQL数据页和B+树的关系;行格式,索引转载 2024-03-13 11:17:04 · 69 阅读 · 0 评论 -
关于Mysql锁知识的整理,全面了解Mysql加锁规则
Mysql加锁机制,Mysql加锁规则原创 2024-03-11 15:59:10 · 293 阅读 · 0 评论 -
Mysql 死锁案例3-间隙锁与意向插入锁冲突
(16, 16,16)换成(3,3,3)即插入数据行的下一条记录有锁,但c=5这个记录锁是事务1加的,与事务1的意向插入锁不冲突,也是隐式锁。同一个事务持有 gap lock (临键锁也一样)的前提下插入数据,会发生锁分裂:执行T1,加锁情况是普通索引c临键锁(0,5]和间隙锁(5,10)写锁成功,加id=5主键记录锁写锁成功,共3把锁。执行T2,锁分裂,加锁情况成了(0,3)(3,5]和(5,10)以及主键id=5的记录锁。事务1持有(0,5)间隙锁写锁,事务申请(0,5)意向插入锁阻塞。原创 2024-03-11 15:56:27 · 925 阅读 · 0 评论 -
什么是Mysql隐式锁?
在数据库中,通常使用锁机制来协调多个线程并发访问某一资源。MySQL的锁类型分为表锁和行锁,表示对整张表加锁,主要用在DDL场景中,也可以由用户指定,主要由server层负责管理;而行锁指的是锁定某一行或几行,或者是行与行之间的间隙,行锁由存储引擎管理,例如最常使用的InnoDB。表锁占用系统资源小,实现简单,但锁定粒度大,发生锁冲突概率高,并发度比较低。行锁占用系统资源大,锁定粒度小,发生锁冲突概率低,并发度比较高。InnoDB将锁分为锁类型和锁模式两类。转载 2024-03-10 20:24:47 · 184 阅读 · 0 评论 -
Mysql 死锁案例2-间隙锁与意向插入锁冲突
上面的案例貌似不怎么贴合实际,因为程序里主动显示的加读锁是不常见的,下面复现一个间隙锁加写锁不冲突,而间隙锁与意向插入锁冲突死锁的例子。SHOW ENGINE INNODB STATUS 查看加锁信息。这里注意点,意向插入锁是没有读锁的,它是写锁性质的。原创 2024-03-10 16:32:29 · 530 阅读 · 0 评论 -
Mysql 死锁案例1-记录锁读写冲突
SHOW ENGINE INNODB STATUS 查看加锁信息。原创 2024-03-10 16:04:35 · 238 阅读 · 0 评论 -
MySQL 有哪些锁?
锁机制用于管理对共享资源的并发访问,实现事务的隔离级别。Mysql 事务采用的是粒度锁:针对表(B+ 树)、页(B+ 树叶子节点)、行(B+ 树叶子节点当中某一记录行)三种粒度加锁。允许事务在行级锁和表级锁的锁同时存在。根据锁的粒度,分为全局锁、表级锁和行级锁。全局锁是针对数据库加锁,表级锁是针对表或页进行加锁;行级锁是针对表的索引加锁。转载 2024-03-10 15:34:39 · 78 阅读 · 0 评论 -
《MySQL实战45讲》课程大纲
1 MySQL实战45讲-01基础架构:一条SQL查询语句是如何执行的? 2 MySQL实战45讲-02日志系统:一条SQL更新语句是如何执行的? 3 MySQL实战45讲-03事务隔离:为什么你改了我还看不见? 4 MySQL实战45讲-04深入浅出索引(上) 5 MySQL实战45讲-05深入浅出索引(下) 6 MySQL实战45讲-06全局锁和表锁:给表加个字段怎么有这么多阻碍? 7 MySQL实战45讲-07行锁功过:怎么减少行锁原创 2024-03-08 00:28:41 · 615 阅读 · 0 评论 -
MySQL实战45讲——15答疑文章(一):日志和索引相关问题
在今天这篇答疑文章更新前,MySQL 实战这个专栏已经更新了 14 篇。在这些文章中,大家在评论区留下了很多高质量的留言。现在,每篇文章的评论区都有热心的同学帮忙总结文章知识点,也有不少同学提出了很多高质量的问题,更有一些同学帮忙解答其他同学提出的问题。在浏览这些留言并回复的过程中,我倍受鼓舞,也尽我所知地帮助你解决问题、和你讨论。评论区的大多数留言我都直接回复了,对于需要展开说明的问题,我都拿出小本子记了下来。这些被记下来的问题,就是我们今天这篇答疑文章的素材了。转载 2024-03-08 00:26:31 · 41 阅读 · 0 评论 -
MySQL实战45讲——18为什么这些SQL语句逻辑相同,性能却差异巨大?
在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。转载 2024-03-08 00:03:22 · 57 阅读 · 0 评论 -
MySQL实战45讲——17如何正确地显示随机消息?
我在上一篇文章,为你讲解完 order by 语句的几种执行模式后,就想到了之前一个做英语学习 App 的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说 MySQL 中的另外一种排序需求,希望能够加深你对 MySQL 排序逻辑的理解。这个英语学习 App 首页有一个随机显示单词的功能,也就是根据每个用户的级别有一个单词表,然后这个用户每次访问首页的时候,都会随机滚动显示三个单词。他们发现随着单词表变大,选单词这个逻辑变得越来越慢,甚至影响到了首页的打开速度。转载 2024-03-07 23:46:21 · 47 阅读 · 0 评论 -
MySQL实战45讲——11怎么给字符串字段加索引?
于是,你就有个问题:当要给字符串创建前缀索引时,有什么方法能够确定我应该使用多长的前缀呢?实际上,我们在建立索引时关注的是区分度,区分度越高越好。因为区分度越高,意味着重复的键值越少。因此,我们可以通过统计索引上有多少个不同的值来判断要使用多长的前缀。转载 2024-03-07 23:30:49 · 136 阅读 · 0 评论 -
MySQL实战45讲——12为什么我的MySQL会“抖”一下?
上述的计算流程比较抽象,不容易理解,所以我画了一个简单的流程图。图中的 F1、F2 就是上面我们通过脏页比例和 redo log 写入速度算出来的两个值。图 3 InnoDB 刷脏页速度策略现在你知道了,InnoDB 会在后台刷脏页,而刷脏页的过程是要将内存页写入磁盘。所以,无论是你的查询语句在需要内存的时候可能要求淘汰一个脏页,还是由于刷脏页的逻辑会占用 IO 资源并可能影响到了你的更新语句,都可能是造成你从业务端感知到 MySQL"抖"了一下的原因。转载 2024-03-07 23:13:12 · 34 阅读 · 0 评论 -
MySQL实战45讲——08事务到底是隔离的还是不隔离的?
你好,我是林晓斌。你现在看到的这篇文章是我重写过的。在第一版文章发布之后,我发现在介绍事务可见性规则时,由于引入了太多概念,导致理解起来很困难。随后,我索性就重写了这篇文章。现在的用户留言中,还能看到第一版文章中引入的 up_limit_id 的概念,为了避免大家产生误解,再此特地和大家事先说明一下。转载 2024-03-07 22:23:31 · 35 阅读 · 0 评论 -
MySQL实战45讲——04深入浅出索引(下)
在上一篇文章中,我和你介绍了 InnoDB 索引的数据结构模型,今天我们再继续聊聊跟 MySQL 索引有关的概念。在开始这篇文章之前,我们先来看一下这个问题:在下面这个表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?下面是这个表的初始化语句。图 1 InnoDB 的索引组织结构在这个过程中,。可以看到,这个查询过程读了 k 索引树的 3 条记录(步骤 1、3 和 5),回表了两次(步骤 2 和 4)。转载 2024-03-07 21:19:05 · 41 阅读 · 0 评论 -
MySQL实战45讲——04深入浅出索引(上)
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说"给某个字段加个索引吧"之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的知识点,加深你对数据库索引的理解。一句话简单来说,。转载 2024-03-07 19:58:10 · 39 阅读 · 0 评论 -
MySQL实战45讲——03事务隔离:为什么你改了我还看不见?
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到"事务"这个概念了。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。转载 2024-03-07 19:42:31 · 48 阅读 · 0 评论 -
MySQL实战45讲——02日志系统:一条SQL更新语句是如何执行的?
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?前面我有跟你介绍过 SQL 语句基本的执行链路,这里我再把那张图拿过来,你也可以先简单看看这个图回顾下。转载 2024-03-07 19:19:53 · 45 阅读 · 0 评论 -
MySQL实战45讲——01基础架构:一条SQL查询语句是如何执行的?
这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程。所以今天我想和你一起把 MySQL 拆解一下,看看里面都有哪些"零件”,希望借由这个拆解过程,让你对 MySQL 有更深入的理解。转载 2024-03-07 19:06:42 · 60 阅读 · 0 评论 -
MySQL实战45讲——44答疑文章(三):说一说这些好问题
这是我们专栏的最后一篇答疑文章,今天我们来说说一些好问题。在我看来,能够帮我们扩展一个逻辑的边界的问题,就是好问题。因为通过解决这样的问题,能够加深我们对这个逻辑的理解,或者帮我们关联到另外一个知识点,进而可以帮助我们建立起自己的知识网络。在工作中会问好问题,是一个很重要的能力。经过这段时间的学习,从评论区的问题我可以感觉出来,紧跟课程学习的同学,对 SQL 语句执行性能的感觉越来越好了,提出的问题也越来越细致和精准了。接下来,我们就一起看看同学们在评论区提到的这些好问题。转载 2024-03-07 16:44:36 · 39 阅读 · 0 评论 -
MySQL实战45讲——43要不要使用分区表?
我经常被问到这样一个问题:分区表有什么问题,为什么公司规范不让使用分区表呢?今天,我们就来聊聊分区表的使用行为,然后再一起回答这个问题。转载 2024-03-07 15:10:49 · 94 阅读 · 0 评论 -
MySQL实战45讲——42grant之后要跟着flush privileges吗?
在 MySQL 里面,grant 语句是用来给用户赋权的。不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用 MySQL 的时候,就是照着一个操作文档的说明按照这个顺序操作的。那么,grant 之后真的需要执行 flush privileges 吗?如果没有执行这个 flush 命令的话,赋权语句真的不能生效吗?转载 2024-03-07 14:44:32 · 160 阅读 · 0 评论 -
MySQL实战45讲——41怎么最快地复制一张表?
Mysql快速复制一张表的三种方式,每种方式的优缺点转载 2024-03-07 14:32:05 · 42 阅读 · 0 评论 -
MySQL实战45讲——40insert语句的锁为什么这么多?
本文摘抄自林晓斌老师《MySQL实战45讲》,文中有部分自己的理解和分析。在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁。因此,insert 语句是一个很轻量的操作。不过,这个结论对于"普通的 insert 语句"才有效。也就是说,还有些 insert 语句是属于"特殊情况"的,在执行过程中需要给其他资源加锁,或者无法在申请到自增 id 以后就立马释放自增锁。那么,今天这篇文章,我们就一起来聊聊这个话题。原创 2024-03-05 22:27:54 · 833 阅读 · 0 评论 -
MySQL实战45讲——39自增主键为什么不是连续的?
自增主键为什么不是连续的?三种原因分析转载 2024-03-05 21:28:03 · 131 阅读 · 0 评论 -
MySQL实战45讲——38都说InnoDB好,那还要不要使用Memory引擎?
我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值在最后一行;而使用磁盘临时表得到的结果里,0 这个值在第一行?今天我们就来看看,出现这个问题的原因吧。转载 2024-03-05 19:43:34 · 38 阅读 · 0 评论 -
MySQL实战45讲——37什么时候会使用内部临时表?
在[第 16]和[第 34]篇文章中,我分别和你介绍了 sort buffer、内存临时表和 join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助 SQL 语句的执行的。其中,我们在排序的时候用到了 sort buffer,在使用 join 语句的时候用到了 join buffer。然后,你可能会有这样的疑问,MySQL 什么时候会使用内部临时表呢?今天这篇文章,我就先给你举两个需要用到内部临时表的例子,来看看内部临时表是怎么工作的。转载 2024-03-05 18:29:00 · 26 阅读 · 0 评论 -
MySQL实战45讲——36为什么临时表可以重名?
在上一篇文章中,我们在优化 join 查询的时候使用到了临时表。你可能会有疑问,为什么要用临时表呢?直接用普通表是不是也可以呢?今天我们就从这个问题说起:临时表有哪些特征,为什么它适合这个场景?这里,我需要先帮你厘清一个容易误解的问题:有的人可能会认为,临时表就是内存表。但是,这两个概念可是完全不同的。内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。转载 2024-03-05 17:47:00 · 54 阅读 · 0 评论 -
Mysql-深入理解顺序io和随机io
在确定数据的位置之后,就需要开始移动这个磁头,将磁头定位到具体磁道,如上图的最上面的那个磁头,在0号盘面上,其先定位到黄色部分的那个磁道;在定位到具体的磁道之后,就通过这个主轴将盘片转动,将扇区转动到磁头指向的地方,这样就可以定位到具体的扇区了,那么就可以将扇区的全部内容读取出。转载 2024-03-05 16:31:50 · 254 阅读 · 0 评论 -
MySQL实战45讲——35join语句怎么优化?
在上一篇文章中,我和你介绍了 join 语句的两种算法,分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。我们发现在使用 NLJ 算法的时候,其实效果还是不错的,比通过应用层拆分成多个语句然后再拼接查询结果更方便,而且性能也不会差。但是,BNL 算法在大表 join 的时候性能就差多了,比较次数等于两个表参与 join 的行数的乘积,很消耗 CPU 资源。当然了,这两个算法都还有继续优化的空间,我们今天就来聊聊这个话题。转载 2024-03-05 00:42:15 · 39 阅读 · 0 评论