![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mysql实战45讲
文章平均质量分 95
想上岸的小写
君子性非异也 善假于物也
展开
-
45自增 id 用完怎么办?
文章目录45 | 自增 id 用完怎么办?表定义自增值idInnoDB 系统自增 row_idXidInnodb trx_idthread_id小结45 | 自增 id 用完怎么办?MySQL 里有很多自增的 id ,每个自增 id 都是定义了初始值,然后不停地往上加步长。虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限。比如,无符号整型 (unsigned int) 是 4 个字节,上限就是 232-1 。既然自增 id 有上限,就有可能被用完。但是,自增 i转载 2021-03-13 14:27:45 · 188 阅读 · 0 评论 -
44答疑文章(三):说一说这些好问题
文章目录44 | 答疑文章(三):说一说这些好问题join 的写法Simple Nested Loop Join 的性能问题distinct 和 group by 的性能备库自增主键问题小结上期问题时间44 | 答疑文章(三):说一说这些好问题这是我们专栏的最后一篇答疑文章,今天我们来说说一些好问题。在我看来,能够帮我们扩展一个逻辑的边界的问题,就是好问题。因为通过解决这样的问题,能够加深我们对这个逻辑的理解,或者帮我们关联到另外一个知识点,进而可以帮助我们建立起自己的知识网络。在工作中会问转载 2021-03-13 13:00:30 · 101 阅读 · 0 评论 -
43要不要使用分区表?
文章目录43 | 要不要使用分区表?分区表是什么?分区表的引擎层行为分区策略分区表的 server 层行为分区表的应用场景小结上期问题时间43 | 要不要使用分区表?我经常被问到这样一个问题:分区表有什么问题,为什么公司规范不让使用分区表呢?今天,我们就来聊聊分区表的使用行为,然后再一起回答这个问题。分区表是什么?为了说明分区表的组织形式,我先创建一个表 t :CREATE TABLE `t` (`ftime` datetime NOT NULL,`c` int(11) DEFAULT转载 2021-03-13 10:53:41 · 214 阅读 · 0 评论 -
42授权命令grant之后要跟着 flush privileges 吗?
文章目录42授权命令grant之后要跟着 flush privileges 吗?全局权限db 权限表权限和列权限flush privileges 使用场景小结上期问题时间42授权命令grant之后要跟着 flush privileges 吗?在 MySQL 里面, grant 语句是用来给用户赋权的。不知道你有没有见过一些操作文档里面提到, grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用MySQL 的时候,就是照着一个操作文档的说明按照这个顺转载 2021-03-13 10:24:25 · 506 阅读 · 0 评论 -
41 | mysql之复制表的三种方式
文章目录41 | 怎么最快地复制一张表?mysqldump 方法导出 CSV 文件物理拷贝方法小结上期问题时间41 | 怎么最快地复制一张表?我在上一篇文章最后,给你留下的问题是怎么在两张表中拷贝数据。如果可以控制对源表的扫描行数和加锁范围很小的话,我们简单地使用 insert … select 语句即可实现。当然,为了避免对源表加读锁,更稳妥的方案是先将数据写到外部文本文件,然后再写回目标表。这时,有两种常用的方法。接下来的内容,我会和你详细展开一下这两种方法。为了便于说明,我还是先创建一个转载 2021-03-13 09:22:55 · 222 阅读 · 0 评论 -
40insert 语句的锁为什么这么多
文章目录40 | insert 语句的锁为什么这么多?insert … select 语句insert 循环写入insert 唯一键冲突insert into … on duplicate key update小结上期问题时间40 | insert 语句的锁为什么这么多?在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁。因此, insert 语句是一个很轻量的操作。不过,这个结论对于 “ 普通的 insert 语句 ” 才有效。也就是说,还有些转载 2021-03-13 08:48:36 · 81 阅读 · 0 评论 -
39 | 自增主键为什么不是连续的?
文章目录39 | 自增主键为什么不是连续的?自增值保存在哪儿?自增值修改机制自增值的修改时机自增锁的优化小结上期问题时间39 | 自增主键为什么不是连续的?在第 4 篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不能保证连续递增。今天这篇文章,我们就来说说这个问题,看看什么情况下自增主键会出现 “ 空洞 ”转载 2021-03-12 20:31:38 · 115 阅读 · 0 评论 -
38都说 InnoDB 好,那还要不要使用 Memory 引擎?
文章目录38 | 都说 InnoDB 好,那还要不要使用 Memory 引擎?内存表的数据组织结构hash 索引和 B-Tree 索引内存表的锁数据持久性问题小结38 | 都说 InnoDB 好,那还要不要使用 Memory 引擎?我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null ,为什么使用内存临时表得到的语句结果里, 0 这个值在最后一行;而使用磁盘临时表得到的结果里, 0 这个值在第一行?今天我们就来看看,出现这个问题的原因吧。内存表的数据转载 2021-03-12 20:08:08 · 106 阅读 · 0 评论 -
37什么时候会使用内部临时表?
文章目录37什么时候会使用内部临时表?union 执行流程group by 执行流程group by 优化方法 -- 索引group by 优化方法 -- 直接排序小结上期问题时间37什么时候会使用内部临时表?在第 16 和第 34 篇文章中,我分别和你介绍了 sort buffer 、内存临时表和 join buffer 。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助 SQL 语句的执行的。其中,我们在排序的时候用到了 sort buffer ,在使用 join 语句的时候用到了转载 2021-03-12 19:04:11 · 175 阅读 · 0 评论 -
36为什么临时表可以重名
文章目录36为什么临时表可以重名?临时表的特性临时表的应用临时表和主备复制小结上期问题时间36为什么临时表可以重名?在上一篇文章中,我们在优化 join 查询的时候使用到了临时表。当时,我们是这么用的:create temporary table temp_t like t1;alter table temp_t add index(b);insert into temp_t select * from t2 where b>=1 and b<=2000;select * from转载 2021-03-12 16:45:14 · 122 阅读 · 0 评论 -
35join 语句怎么优化?
文章目录35 | join 语句怎么优化?Multi-Range Read 优化Batched Key AccessBNL 算法的性能问题BNL 转 BKA扩展 -hash join小结上期问题时间35 | join 语句怎么优化?在上一篇文章中,我和你介绍了 join 语句的两种算法,分别是 Index Nested-Loop Join(NLJ) 和Block Nested-Loop Join(BNL) 。我们发现在使用 NLJ 算法的时候,其实效果还是不错的,比通过应用层拆分成多个语句然后再拼接查转载 2021-03-12 12:59:54 · 99 阅读 · 0 评论 -
34 到底可不可以使用join
文章目录34 到底可不可以使用joinIndex Nested-Loop JoinSimple Nested-Loop JoinBlock Nested-Loop Join小结上期问题时间34 到底可不可以使用join在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类:我们 DBA 不让使用 join ,使用 join 有什么问题呢?如果有两个大小不同的表做 join ,应该用哪个表做驱动表呢?今天这篇文章,我就先跟你说说 join 语句到底是怎么执行的,然后再来回答这两个问题。转载 2021-03-12 12:39:20 · 92 阅读 · 0 评论 -
33我查这么多数据,会不会把数据库内存打爆?
文章目录33我查这么多数据,会不会把数据库内存打爆?全表扫描对 server 层的影响全表扫描对 InnoDB 的影响小结上期问题时间33我查这么多数据,会不会把数据库内存打爆?我的主机内存只有 100G ,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了?这个问题确实值得担心,被系统 OOM ( out of memory )可不是闹着玩的。但是,反过来想想,逻辑备份的时候,可不就是做整库扫描吗?如果这样就会把内存吃光,逻辑备份不是早就挂了?所以说,对大表做全表扫描,看转载 2021-03-11 09:02:33 · 241 阅读 · 0 评论 -
32为什么还有 kill 不掉的语句?
文章目录32 | 为什么还有 kill 不掉的语句?收到 kill 以后,线程做什么?另外两个关于客户端的误解小结上期问题时间32 | 为什么还有 kill 不掉的语句?在 MySQL 中有两个 kill 命令:一个是 kill query + 线程 id ,表示终止这个线程中正在执行的语句;一个是 kill connection + 线程 id ,这里 connection 可缺省,表示断开这个线程的连接,当然如果这个线程有语句正在执行,也是要先停止正在执行的语句的。不知道你在使用 MySQL转载 2021-03-09 02:40:43 · 385 阅读 · 0 评论 -
31误删数据后除了跑路,还能怎么办?
文章目录31 | 误删数据后除了跑路,还能怎么办?误删行误删库 / 表延迟复制备库rm 删除数据小结上期问题时间误删行误删库 / 表延迟复制备库rm 删除数据小结上期问题时间31 | 误删数据后除了跑路,还能怎么办?今天我要和你讨论的是一个沉重的话题:误删数据。在前面几篇文章中,我们介绍了 MySQL 的高可用架构。当然,传统的高可用架构是不能预防误删数据的,因为主库的一个 drop table 命令,会通过 binlog 传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。虽然转载 2021-03-09 02:11:05 · 1084 阅读 · 0 评论 -
30答疑文章(二):用动态的观点看加锁
文章目录30 | 答疑文章(二):用动态的观点看加锁不等号条件里的等值查询等值查询的过程怎么看死锁?怎么看锁等待?update 的例子小结上期问题时间30 | 答疑文章(二):用动态的观点看加锁在第 20 和 21 篇文章中,我和你介绍了 InnoDB 的间隙锁、 next-key lock ,以及加锁规则。在这两篇文章的评论区,出现了很多高质量的留言。我觉得通过分析这些问题,可以帮助你加深对加锁规则的理解。所以,我就从中挑选了几个有代表性的问题,构成了今天这篇答疑文章的主题,即:用动态的观点看加转载 2021-03-09 01:51:51 · 131 阅读 · 0 评论 -
29如何检测msyql实例健康状态
文章目录29如何检测msyql实例健康状态select 1 判断查表判断更新判断上期问题时间29如何检测msyql实例健康状态我在第 25 和 27 篇文章中,和你介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切换,往往是因为主库出问题了,由 HA 系统发起的。这也就引出了我们今转载 2021-03-08 13:07:14 · 324 阅读 · 0 评论 -
28mysql读写分离的过期读
文章目录强制走主库方案Sleep 方案判断主备无延迟方案配合 semi-sync等主库位点方案GTID 方案小结上期问题时间一主多从基本结构 – 主备切换图 1 读写分离基本结构读写分离的主要目标就是分摊主库的压力。图 1 中的结构是客户端( client )主动做负载均衡,这种模式下一般会把数据库的连接信息放在客户端的连接层。也就是说,由客户端来选择后端数据库进行查询。还有一种架构是,在 MySQL 和客户端之间有一个中间代理层 proxy ,客户端只连接 proxy , 由proxy 根据转载 2021-03-08 12:53:20 · 160 阅读 · 0 评论 -
27主库出问题了,从库怎么办?
文章目录基于位点的主备切换GTID基于 GTID 的主备切换小结上期问题时间一主多从图 1 一主多从基本结构图中,虚线箭头表示的是主备关系,也就是 A 和 A’ 互为主备, 从库 B 、 C 、 D 指向的是主库 A 。一主多从的设置,一般用于读写分离,主库负责所有的写入和一部分读,其他的读请求则由从库分担。今天我们要讨论的就是,在一主多从架构下,主库故障后的主备切换问题。如图 2 所示,就是主库发生故障,主备切换后的结果。图 2 一主多从基本结构 – 主备切换相比于一主一备的切换流程转载 2021-03-07 16:45:14 · 147 阅读 · 0 评论 -
26备库为什么会延迟好几个小时?
文章目录MySQL 5.5 版本的并行复制策略按表分发策略按行分发策略MySQL 5.6 版本的并行复制策略MariaDB 的并行复制策略MySQL 5.7 的并行复制策略小结上期问题时间备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库的节奏。图 1 主备流程图谈到主备的并行复制能力,我们要关注的是图中黑色的两个箭头。一个箭头代表了客户端写入主库,另一箭头代表的是备库上 sql_thread 执行中转日转载 2021-03-07 16:20:49 · 209 阅读 · 0 评论 -
25MySQL 是怎么保证高可用的?
文章目录主备延迟主备延迟的来源解决主备延迟策略可靠性优先策略可用性优先策略小结上期问题时间MySQL 主备切换流程 – 双 M 结构主备延迟主备切换可能是一个主动运维动作,比如软件升级、主库所在机器按计划下线等,也可能是被动操作,比如主库所在机器掉电。接下来,我们先一起看看主动切换的场景。在介绍主动切换流程的详细步骤之前,我要先跟你说明一个概念,即 “ 同步延迟 ” 。与数据同步有关的时间点主要包括以下三个:主库 A 执行完成一个事务,写入 binlog ,我们把这个时刻记为 T1;之后传转载 2021-03-07 15:35:17 · 141 阅读 · 0 评论 -
24MySQL 是怎么保证主备一致的
文章目录MySQL 主备的基本原理binlog 的三种格式对比为什么会有 mixed 格式的 binlog ?循环复制问题小结上期问题时间MySQL 主备的基本原理图 1 MySQL 主备切换流程在状态 1 中,客户端的读写都直接访问节点 A ,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。当需要切换的时候,就切成状态 2 。这时候客户端读写访问的都是节点 B ,而节点 A 是 B 的备库。在状态 1 中,虽然节点 B 没有被直转载 2021-03-07 15:12:50 · 284 阅读 · 0 评论 -
23MySQL 是怎么保证数据不丢的
文章目录23 | MySQL 是怎么保证数据不丢的binlog 的写入机制redo log 的写入机制小结上期问题时间23 | MySQL 是怎么保证数据不丢的只要 redo log 和 binlog 保证持久化到磁盘,就能确保 MySQL 异常重启后,数据可以恢复。binlog 的写入机制其实, binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 binlog cache ,事务提交的时候,再把 binlog cache 写到 binlog 文件中。一个事务的 binlog 是不能被转载 2021-03-07 14:34:59 · 112 阅读 · 0 评论 -
22mysql提高性能的临时方案
文章目录22mysql提高性能的临时方案短连接风暴第一种方法:先处理掉那些占着连接但是不工作的线程。第二种方法:减少连接过程的消耗。慢查询性能问题导致慢查询的第一种可能是,索引没有设计好导致慢查询的第二种可能是,语句没写好。MySQL 选错了索引QPS 突增问题小结22mysql提高性能的临时方案短连接风暴正常的短连接模式就是连接到数据库后,执行很少的 SQL 语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然暴涨的情况。MySQL 建立连接的过程,成本转载 2021-03-07 13:57:10 · 107 阅读 · 0 评论 -
21修改数据引发的锁
文章目录21修改数据引发的锁案例一:等值查询间隙锁案例二:非唯一索引等值锁案例三:主键索引范围锁案例四:非唯一索引范围锁案例五:唯一索引范围锁 bug案例六:非唯一索引上存在 " " 等值 " " 的例子案例七: limit 语句加锁案例八:一个死锁的例子小结上期问题时间21修改数据引发的锁加锁规则有以下两条前提说明:MySQL 后面的版本可能会改变加锁策略,所以这个规则只限于截止到现在的最新版本,即5.x 系列 <=5.7.24 , 8.0 系列 <=8.0.13 。如果大家在转载 2021-03-07 13:40:06 · 167 阅读 · 0 评论 -
20幻读是什么,幻读有什么问题
文章目录20 | 幻读是什么,幻读有什么问题?幻读是什么?幻读有什么问题?小结上期问题时间20 | 幻读是什么,幻读有什么问题?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=InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,1转载 2021-03-07 12:52:23 · 157 阅读 · 0 评论 -
19为什么我只查一行的语句,也执行这么慢?
文章目录19 | 为什么我只查一行的语句,也执行这么慢?第一类:查询长时间不返回等 MDL 锁等 flush等行锁第二类:查询慢小结上期问题时间19 | 为什么我只查一行的语句,也执行这么慢?一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下, “ 查一行 ” ,也会执行得特别慢。今天,我就跟你聊聊这个有趣的话题,看看什么情况下,会出现这个现象。需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或i转载 2021-03-06 19:07:34 · 77 阅读 · 0 评论 -
18为什么这些 SQL 语句逻辑相同,性能却差异巨大?
18| 为什么这些 SQL 语句逻辑相同,性能却差异巨大?文章目录18| 为什么这些 SQL 语句逻辑相同,性能却差异巨大?案例一:条件字段函数操作案例二:隐式类型转换案例三:隐式字符编码转换小结上期问题时间在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。案例一:条件字段函数操作假设你现在维护了一个交易系统,转载 2021-03-06 17:58:31 · 88 阅读 · 0 评论 -
17 | 如何正确地显示随机消息?
文章目录17 | 如何正确地显示随机消息?第一类:查询长时间不返回等 MDL 锁等 flush等行锁第二类:查询慢17 | 如何正确地显示随机消息?构造一个表,基于这个表来说明今天的问题。这个表有两个字段 id 和 c ,并且我在里面插入了 10 万行记录。mysql> CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;delimite转载 2021-03-01 20:04:02 · 151 阅读 · 0 评论 -
16 | “order by” 是怎么工作的?
文章目录16 | “order by” 是怎么工作的?全字段排序rowid 排序小结上期问题时间16 | “order by” 是怎么工作的?CREATE TABLE `t` (`id` int(11) NOT NULL,`city` varchar(16) NOT NULL,`name` varchar(16) NOT NULL,`age` int(11) NOT NULL,`addr` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`),KEY `转载 2021-03-01 20:02:58 · 140 阅读 · 0 评论 -
15 | 答疑文章(一):日志和索引相关问题
文章目录15 | 答疑文章(一):日志和索引相关问题追问 1 : MySQL 怎么知道 binlog 是完整的 ?追问 2 : redo log 和 binlog 是怎么关联起来的 ?追问 3 :处于 prepare 阶段的 redo log 加上完整 binlog ,重启就能恢复, MySQL 为什么要这么设计 ?追问 4 :如果这样的话,为什么还要两阶段提交呢?干脆先 redo log 写完,再写追问 5 :不引入两个日志,也就没有两阶段提交的必要了。只用 binlog 来支持崩溃恢复,又能支持归档转载 2021-03-01 20:01:30 · 176 阅读 · 0 评论 -
14 | count(*) 这么慢,我该怎么办?
文章目录14 | count(*) 这么慢,我该怎么办?用缓存系统保存计数在数据库保存计数不同的 count 用法小结上期问题时间14 | count(*) 这么慢,我该怎么办?count(*)的实现方式你首先要明确的是,在不同的 MySQL 引擎中, count(*)有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*)的时候会直接返回这个数,效率很高而 InnoDB 引擎就麻烦了,它执行 count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累转载 2021-03-01 09:41:56 · 588 阅读 · 0 评论 -
13 | 为什么表数据删掉一半,表文件大小不变?
文章目录13 | 为什么表数据删掉一半,表文件大小不变?参数 innodb_file_per_table数据删除流程重建表Online 和 inplace小结上期问题时间13 | 为什么表数据删掉一半,表文件大小不变?一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以 .frm 为后缀的文件里。而MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数据。参数 innodb转载 2021-02-26 20:38:29 · 166 阅读 · 0 评论 -
12 | 为什么我的 MySQL 会 “ 抖 ” 一下?
文章目录12 | 为什么我的 MySQL 会 “ 抖 ” 一下?InnoDB 刷脏页的控制策略小结上期问题时间12 | 为什么我的 MySQL 会 “ 抖 ” 一下?InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo log (重做日志),也就是《孔乙己》里咸亨酒店掌柜用来记账的粉板,在更新内存写完 redo log 后,就返回给客户端,本次更新成功。做下类比的话,掌柜记账的账本是数据文件,记账用的粉板是日志文件( redo log ),掌柜的记忆就是内存。掌转载 2021-02-26 20:32:44 · 100 阅读 · 0 评论 -
11 | 怎么给字符串字段加索引?
文章目录11 | 怎么给字符串字段加索引?前缀索引对覆盖索引的影响其他方式小结上期问题时间11 | 怎么给字符串字段加索引?假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64),...)engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:mysql> select f1, f2 f转载 2021-02-26 20:31:22 · 143 阅读 · 0 评论 -
10 | MySQL 为什么有时候会选错索引?
文章目录10 | MySQL 为什么有时候会选错索引?优化器的逻辑索引选择异常和处理小结上期问题时间10 | MySQL 为什么有时候会选错索引?在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?我们先建一个简单的表,表里有 a 、 b 两个字段,并分别建上索引:CREATE转载 2021-02-26 14:49:24 · 142 阅读 · 0 评论 -
09 | 普通索引和唯一索引,应该怎么选择?
文章目录09 | 普通索引和唯一索引,应该怎么选择?查询过程更新过程change buffer 的使用场景索引选择和实践change buffer 和 redo log小结上期问题时间09 | 普通索引和唯一索引,应该怎么选择?假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:select name from CUser where id_card = 'xxxxxxxy转载 2021-02-26 14:48:04 · 93 阅读 · 0 评论 -
08 | 事务到底是隔离的还是不隔离的?
文章目录08 | 事务到底是隔离的还是不隔离的?“ 快照 ” 在 MVCC 里是怎么工作的?更新逻辑小结上期问题时间08 | 事务到底是隔离的还是不隔离的?我在第 3 篇文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view ,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,我在上一篇文章中,和你分享行锁的时候又提到转载 2021-02-26 14:44:45 · 128 阅读 · 0 评论 -
07 | 行锁功过:怎么减少行锁对性能的影响?
文章目录07 | 行锁功过:怎么减少行锁对性能的影响?从两阶段锁说起死锁和死锁检测小结上期问题时间07 | 行锁功过:怎么减少行锁对性能的影响?MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。 InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。我们今天就主要来聊聊 InnoD转载 2021-02-26 13:04:22 · 79 阅读 · 0 评论 -
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?根据加锁的范围, MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁顾名思义,全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL) 。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是转载 2021-02-26 11:05:19 · 119 阅读 · 0 评论