摘要: 在上一篇文章中,我和你介绍了间隙锁和next-key lock的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。 所以今天,我们就先从这个加锁规则开始吧。 首先说明一下,这些加锁规则我没在别的地方看到过有类似的总结,以前 阅读全文
posted @ 2021-08-10 22:48 brady-wang 阅读(37) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章最后,我给你留了一个关于加锁规则的问题。今天,我们就从这个问题说起吧。 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。建表和初始化语句如下(为了便于本期的例子说明,我把上篇文章中用到的表结构做了点儿修改): CREATE TABLE `t` ( `id` int(11) N 阅读全文
posted @ 2021-08-10 22:24 brady-wang 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下,“查一行”,也会执行得特别慢。今天,我就跟你聊聊这个有趣的话题,看看什么情况下,会出现这个现象。 需要说明的是,如果MySQL数据库本身就有很大的压力,导致数据库服务器CPU占用率很高或iou 阅读全文
posted @ 2021-08-10 17:49 brady-wang 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。 我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。 案例一:条件字段函数操作 假设你现在维护了一个交易系统,其中交易记录表t 阅读全文
posted @ 2021-08-10 17:26 brady-wang 阅读(69) 评论(0) 推荐(0) 编辑
摘要: 我在上一篇文章,为你讲解完order by语句的几种执行模式后,就想到了之前一个做英语学习App的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说MySQL中的另外一种排序需求,希望能够加深你对MySQL排序逻辑的理解。 这个英语学习App首页有一个随机显示单词的功能,也就是 阅读全文
posted @ 2021-08-10 16:26 brady-wang 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。 假设这个表的部分定义是这样的: CREATE TABLE `t` ( `id` int(11) NO 阅读全文
posted @ 2021-08-10 16:10 brady-wang 阅读(61) 评论(0) 推荐(0) 编辑
摘要: 之前我们了解了一条查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条 SQL 更新语句的执行流程又是怎样的呢? 首先我们创建一个表 user_info,主键为 id,创建语句如下: Copy 阅读全文
posted @ 2021-08-10 15:25 brady-wang 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 我在第2篇文章《日志系统:一条SQL更新语句是如何执行的?》中,和你讲到binlog(归档日志)和redo log(重做日志)配合崩溃恢复的时候,用的是反证法,说明了如果没有两阶段提交,会导致MySQL出现主备数据不一致等问题。 在这篇文章下面,很多同学在问,在两阶段提交的不同瞬间,MySQL如果发 阅读全文
posted @ 2021-08-10 13:52 brady-wang 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要 阅读全文
posted @ 2021-08-10 13:48 brady-wang 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题。 这里,我们还是针对MySQL中应用最广泛的InnoDB引擎展开讨论。一个InnoDB表包含两部分,即:表结构定义和数据。在MyS 阅读全文
posted @ 2021-08-10 11:33 brady-wang 阅读(76) 评论(0) 推荐(0) 编辑
摘要: 前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的。但是,你写SQL语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由MySQL来确定的。 不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于MySQL选错了索引,而导致执行速度变得很慢? 我们 阅读全文
posted @ 2021-08-10 11:31 brady-wang 阅读(43) 评论(0) 推荐(0) 编辑
摘要: #mysql 刷脏页 ··· mysql> select @@innodb_flush_neighbors; @@innodb_flush_neighbors 1 1 row in set (0.00 sec) mysql> ··· 脏页,干净页 当内存数据页和磁盘数据页上的内容不一致时,我们称这个 阅读全文
posted @ 2021-08-10 11:28 brady-wang 阅读(459) 评论(0) 推荐(0) 编辑