摘要:
在上一篇文章最后,我给你留了一个关于加锁规则的问题。今天,我们就从这个问题说起吧。 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。建表和初始化语句如下(为了便于本期的例子说明,我把上篇文章中用到的表结构做了点儿修改): 这个表除了主键id外,还有一个索引c,初始化语句在表中插入了6行数 阅读全文
posted @ 2019-07-06 11:36
代码堆里的看客
阅读(1335)
评论(1)
推荐(0)
摘要:
一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下,“查一行”,也会执行得特别慢。今天,我就跟你聊聊这个有趣的话题,看看什么情况下,会出现这个现象。 需要说明的是,如果MySQL数据库本身就有很大的压力,导致数据库服务器CPU占用率很高或iou 阅读全文
posted @ 2019-07-06 11:35
代码堆里的看客
阅读(316)
评论(0)
推荐(0)
摘要:
我在上一篇文章,为你讲解完order by语句的几种执行模式后,就想到了之前一个做英语学习App的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说MySQL中的另外一种排序需求,希望能够加深你对MySQL排序逻辑的理解。 这个英语学习App首页有一个随机显示单词的功能,也就是 阅读全文
posted @ 2019-07-06 11:34
代码堆里的看客
阅读(265)
评论(0)
推荐(0)
摘要:
在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。 我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。 案例一:条件字段函数操作 假设你现在维护了一个交易系统,其中交易记录表t 阅读全文
posted @ 2019-07-06 11:34
代码堆里的看客
阅读(425)
评论(0)
推荐(0)
摘要:
在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。 假设这个表的部分定义是这样的: 这时,你的SQL语句可以这么写: 这个语句看上去逻辑很清晰,但是你了 阅读全文
posted @ 2019-07-06 11:33
代码堆里的看客
阅读(309)
评论(0)
推荐(0)
摘要:
在今天这篇答疑文章更新前,MySQL实战这个专栏已经更新了14篇。在这些文章中,大家在评论区留下了很多高质量的留言。现在,每篇文章的评论区都有热心的同学帮忙总结文章知识点,也有不少同学提出了很多高质量的问题,更有一些同学帮忙解答其他同学提出的问题。 在浏览这些留言并回复的过程中,我倍受鼓舞,也尽我所 阅读全文
posted @ 2019-07-06 11:32
代码堆里的看客
阅读(269)
评论(0)
推荐(0)
摘要:
经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题。 这里,我们还是针对MySQL中应用最广泛的InnoDB引擎展开讨论。一个InnoDB表包含两部分,即:表结构定义和数据。在MyS 阅读全文
posted @ 2019-07-06 11:31
代码堆里的看客
阅读(319)
评论(0)
推荐(0)
摘要:
在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要 阅读全文
posted @ 2019-07-06 11:31
代码堆里的看客
阅读(254)
评论(0)
推荐(0)
摘要:
平时的工作中,不知道你有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。 看上去,这就像是数据库“抖”了一下。今天,我们就一起来看一看这是什么原因。 你的SQL语句为什么变“慢”了 在前面 阅读全文
posted @ 2019-07-06 11:30
代码堆里的看客
阅读(298)
评论(0)
推荐(0)
摘要:
现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的: 由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句: 从第4和第5篇讲解索引的文章中,我们可以知道,如果email这个字段上没有 阅读全文
posted @ 2019-07-06 11:27
代码堆里的看客
阅读(2224)
评论(0)
推荐(0)
摘要:
今天的正文开始前,我要特意感谢一下评论区几位留下高质量留言的同学。 用户名是 @某、人 的同学,对文章的知识点做了梳理,然后提了关于事务可见性的问题,就是先启动但是后提交的事务,对数据可见性的影响。@夏日雨同学也提到了这个问题,我在置顶评论中回复了,今天的文章末尾也会再展开说明。@Justin和@倪 阅读全文
posted @ 2019-07-06 11:25
代码堆里的看客
阅读(375)
评论(0)
推荐(0)
摘要:
在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行, 阅读全文
posted @ 2019-07-06 11:24
代码堆里的看客
阅读(378)
评论(1)
推荐(0)
摘要:
我在第3篇文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务T启动的时候会创建一个视图read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。 但是,我在上一篇文章 阅读全文
posted @ 2019-07-06 11:24
代码堆里的看客
阅读(316)
评论(0)
推荐(0)
摘要:
今天我要跟你聊聊MySQL的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表 阅读全文
posted @ 2019-07-06 11:23
代码堆里的看客
阅读(315)
评论(0)
推荐(0)
摘要:
在上一篇文章中,我和你介绍了InnoDB索引的数据结构模型,今天我们再继续聊聊跟MySQL索引有关的概念。 在开始这篇文章之前,我们先来看一下这个问题: 在下面这个表T中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少 阅读全文
posted @ 2019-07-06 11:22
代码堆里的看客
阅读(299)
评论(0)
推荐(0)
摘要:
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这100块钱 阅读全文
posted @ 2019-07-06 11:21
代码堆里的看客
阅读(270)
评论(0)
推荐(0)
摘要:
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。 数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重 阅读全文
posted @ 2019-07-06 11:21
代码堆里的看客
阅读(295)
评论(0)
推荐(0)
摘要:
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又是怎样的呢? 之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态 阅读全文
posted @ 2019-07-06 11:20
代码堆里的看客
阅读(432)
评论(0)
推荐(0)
摘要:
这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个ID字段,在执行下面这个查询 阅读全文
posted @ 2019-07-06 11:19
代码堆里的看客
阅读(292)
评论(1)
推荐(0)

浙公网安备 33010602011771号