随笔分类 - MySQL实战45讲
摘要:一个InnoDB表包含两部分:表结构定义和数据。在MySQL 8.0版本前,表结构存在以.frm为后缀的文件里。之后的版本允许把表结构定义放在系统数据表中。由于表结构定义占用空间很小,所以主要讨论表数据。 接下来,先说明为什么简单删除表数据达不到表空间回收的效果,再介绍正确回收空间的方法。 参数in
阅读全文
摘要:一条SQL语句,正常执行时候特别快,但有时会变得特别慢,且这种情况很难复现,随机且持续时间很短,看上去像是“抖”了一下。 你的SQL语句为什么变“慢”了 在MySQL 02中,介绍了WAL机制,InnoDB在处理更新语句时,更新内存写完redo log后,就返回给客户端,本次更新成功。 而内存里的数
阅读全文
摘要:场景引入 假设现在维护一个支持邮箱登录的系统,用户表定义如下: create table SUser(ID bigint unsigned primary key,email varchar(64), ... )engine=innodb; 由于登录方式为邮箱,那么一定会有下面这样的业务: sele
阅读全文
摘要:场景引入 我们知道,MySQL中一张表可以支持多个索引。但是写SQL语句时,并没有主动指定使用哪个索引,而是由MySQL来确定。而有时候,MySQL会选错索引,导致执行速度变得很慢。 举个例子,假设一张表里有(id,a,b)三个字段,并分别建立索引。然后往表中插入10万行记录,取值依次递增,即数据从
阅读全文
摘要:唯一索引:字段值不能重复。 普通索引:字段值可以重复。 假设数据如下图,且字段k上的值都不重复: 接下来,从两种索引对查询语句和更新语句的性能影响来分析。 查询过程 假设查询语句为select id from T where k=5。那么首先会在字段k的索引树上找到k=5所在的数据页,然后在数据页内
阅读全文
摘要:场景引入 我们知道,在可重复读的隔离级别下,一个事务A启动的时候会创建一个read view,之后在这个事务A执行期间,即使其他事务修改数据,事务A看到的仍然和启动时相同。 考虑一个问题,假如该事务A想要对一行做更新,而此时这行的行锁被其他事务B持有,那么事务A会被锁住而等待行锁。当事务A获取到行锁
阅读全文
摘要:行锁是针对数据表中行记录的锁,是在引擎层由引擎实现的。 从两阶段锁说起 在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立即释放,而是等到事务结束时才释放,这就是两阶段锁协议。 知道这个设定后,如果事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。 举个例
阅读全文
摘要:根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类,本文先讨论前两种。 全局锁 全局锁是对整个数据库实例加锁,MySQL提供的加全局读锁的命令是Flush tables with read lock(下面简称FTWRL)。当需要让整个库处于只读状态时,可以使用这个命令,之后其他线
阅读全文
摘要:覆盖索引 假设要执行一条语句: select * from T where k between 3 and 5; 初始对列k建立了索引,表中数据为: 那么其执行流程为: 在k索引树上找到k=3的记录,取得ID=300; 到ID索引树查到ID=300对应的记录。 在k索引树上找到下一个值k=5的记录,
阅读全文
摘要:索引的常见模型 实现索引的方式有很多种,这里先介绍三种常见结构:哈希表、有序数组和搜索树。 哈希表:只适用于只有等值查询的场景。 有序数组:在等值查询和范围查询场景中的性能都非常优秀,但是在更新数据的时候需要挪动大量记录。因此,只适用于静态存储引擎。 二叉搜索树:树层数可能很高,可能一个节点上的数据
阅读全文
摘要:事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的,这也是InnoDB取代MyISAM的重要原因之一。 隔离性与隔离级别 事务的四大特性:原子性、一致性、隔离性、持久性。本文主要讨论隔离性。 当数据库上有多个事务同时执行的时候,可能出现脏读、不可重复读
阅读全文
摘要:比如执行一条更新语句: update T set c=c+1 where ID=2; 首先,更新语句也会走一遍查询语句的流程。除此以外,更新还涉及两个日志模块,分别是redo log和binlog。 redo log MySQL的更新用到了WAL(Write-Ahead Logging)技术,关键点
阅读全文
摘要:比如执行一条查询语句: select * from T where ID=10; 首先给出MySQL的基本架构示意图,从中也可以看到执行过程: 基本结构分为两部分: Server层。里面包含连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL大多数核心服务功能,以及所有内置函数。 存储引擎层。
阅读全文

浙公网安备 33010602011771号