12 为什么我的MySQL会“抖”一下? 12 为什么我的MySQL会“抖”一下?平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。 看上去,这就像是数据库“抖”了一下。今天,我们就一起来看一看这是什么原因。 你的 SQL 语句为什么变“慢”了在前面第 2 篇文章[《日志系统:一条 2022-08-23 专栏 > MySQL实战45讲
13 为什么表数据删掉一半,表文件大小不变? 13 为什么表数据删掉一半,表文件大小不变?经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题。 这里,我们还是针对 MySQL 中应用最广泛的 InnoDB 引擎展开讨论。一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0版本以前 2022-08-23 专栏 > MySQL实战45讲
16 “order by”是怎么工作的? 16 “order by”是怎么工作的?在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000 个人的姓名、年龄。 假设这个表的部分定义是这样的: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` 2022-08-23 专栏 > MySQL实战45讲
14 count()这么慢,我该怎么办? 14 count()这么慢,我该怎么办?在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t语句不就解决了吗? 但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。 那么 2022-08-23 专栏 > MySQL实战45讲
17 如何正确地显示随机消息? 17 如何正确地显示随机消息?我在上一篇文章,为你讲解完 order by 语句的几种执行模式后,就想到了之前一个做英语学习 App的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说 MySQL 中的另外一种排序需求,希望能够加深你对 MySQL 排序逻辑的理解。 这个英语学习 App首页有一个随机显示单词的功能,也就是根据每个用户的级别有一个单词表, 2022-08-23 专栏 > MySQL实战45讲
18 为什么这些SQL语句逻辑相同,性能却差异巨大? 18 为什么这些SQL语句逻辑相同,性能却差异巨大?在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。 我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。 案例一:条件字段函数操作假设你现在维护了一个交易系统,其中交易记录表 tradelog 包 2022-08-23 专栏 > MySQL实战45讲
19 为什么我只查一行的语句,也执行这么慢? 19 为什么我只查一行的语句,也执行这么慢?一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下,“查一行”,也会执行得特别慢。今天,我就跟你聊聊这个有趣的话题,看看什么情况下,会出现这个现象。 需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或 ioutil(IO利用率)很高 2022-08-23 专栏 > MySQL实战45讲
15 答疑文章(一):日志和索引相关问题 15 答疑文章(一):日志和索引相关问题在今天这篇答疑文章更新前,MySQL 实战这个专栏已经更新了 14篇。在这些文章中,大家在评论区留下了很多高质量的留言。现在,每篇文章的评论区都有热心的同学帮忙总结文章知识点,也有不少同学提出了很多高质量的问题,更有一些同学帮忙解答其他同学提出的问题。 在浏览这些留言并回复的过程中,我倍受鼓舞,也尽我所知地帮助你解决问题、和你讨论。可以 2022-08-23 专栏 > MySQL实战45讲
20 幻读是什么,幻读有什么问题? 20 幻读是什么,幻读有什么问题?在上一篇文章最后,我给你留了一个关于加锁规则的问题。今天,我们就从这个问题说起吧。 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。建表和初始化语句如下(为了便于本期的例子说明,我把上篇文章中用到的表结构做了点儿修改): CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(1 2022-08-23 专栏 > MySQL实战45讲
21 为什么我只改一行的语句,锁这么多? 21 为什么我只改一行的语句,锁这么多?在上一篇文章中,我和你介绍了间隙锁和 next-key lock的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。 所以今天,我们就先从这个加锁规则开始吧。 首先说明一下,这些加锁规则我没在别的地方看到过有类似的总结,以前我自己判断的时候都是想着代码里面的实 2022-08-23 专栏 > MySQL实战45讲