Mysql-行锁
1. 两阶段锁 下面的操作序列中,如果为两行数据加了行锁事务 B 的 update 语句执行时会是什么现象呢?假设字段 id 是表 t 的主键。**** 在 InnoDB 中,行锁是在需要的时候加上,在**事务结束时释放。(最有可能造成锁冲突的行的读锁尽量往后放)** 示例: 顾客 A 在影院 B 买电影票 操作如下 从顾客 A 账户余额中扣除电影票价; 给影院 B 的账户余额增加这张电影票价; 记录一条交易日志。 其中多个顾客买票可能造成 B 的账户行数据冲突。因此将 B 的操作放在最后。最大程度减少了事务之间的锁等待。 2. 死锁和死锁检测示例:当行锁同时锁住 id=1 和 2 的两行数据 在这种情况下事务 A 等待 id=2 的行锁,事务 B 等待 id=1 的行锁。事务 A 和事务 B 互相都在等待对方无法释放的资源,从而进入了死锁。 解决方法 设置获取锁等待时间:设置获取锁超时时间,如果超时则锁住的线程自动退出。通过 innodb_lock_wait_timeout 来设置等待时间默认为 50s 发起死锁检测:发现死锁后主动回滚争抢锁的某一个事务。让其他事务继续 ...
Mysql-索引
1.索引常见模型1. 哈希表 通过 hash 算法将 key 换算成确定的位置,然后把 value 放入到这个数组的位置。如果数组已经存在值, 则通过拉链法,拉出一条链表。 优点:等值查询的情况下查询效率高 缺点:范围查询效率低下 2. 有序数组 优点:等值和范围查询效率高 缺点:插入、删除数据效率低下 场景:只适用于静态存储引擎 3. 二叉搜索树 缺点:数据量大的情况下,导致树很高,需要进行多次磁盘读取数据,比较浪费时间。 2. InnoDB 索引模型B+树 3. 主键索引和非主键索引InnoDB 里面主键索引也被称为聚簇索引 非主键索引的叶子节点存储的是主键的值 主键索引和非主键索引的区别 主键查询: 只需要查询主键索引的 B+树,查询出对应的数据 非主键索引:查询非主键索引的树,获得对应的主键值,然后通过主键值查询主键索引的 B+树 4. 索引维护概念: 当数据页中数据存储满了,会生成一个新的数据页,然后原有数据也中的部分数据会移到新的数据也中。这种过程叫做页分裂。 同理页合并是两个数据页中的数据太少了,合并到一个数据页中。 5. 索引覆盖1. 回表 select * fr ...
Mysql-事务隔离
1. 隔离性和隔离级别1. 事务特性 原子性 持久性 隔离性 一致性 2. 事务隔离级别 读已提交(事务未提交时,变更能被其它事务看到) 读未提交(事务提交后,其它事务才能看到变更) 可重复读(一个事务执行过程中,总是跟启动时看到的数据是一致的。未提交的变更对其它事务不可见) 串行化(同一行记录写会加写锁,读会读锁。当出现读写锁冲突时,后访问的事务,必须等前一个事务完成,才能执行) v1=v2=1,v3=2 四种事务得到的结果 读未提交: v1、v2、v3=2 读已提交: v1=1 ,v2、v3=2 可重复读:v1=v2=1,v3=2 可串行化 : v1=v2=1,v3=2 2. 事务隔离的实现当一个值从 1 按顺序变成 2,3,3 那么他的日志里面就会有类似的回滚段记录 如图事务 A、B、C 修改记录导致一个字段对应多个值。 通过 MVCC 来实现一个数据的多个版本,通过 undo log 实现数据版本的回滚 通过 MVCC 和 undo log 来实现事务的隔离 具体可以参考 Mysql 实战 45 讲 当回滚段日志过长时,系统会自动清除。 3. 事务的启动方式 s ...
Mysql-更新语句的执行
1. 更新语句执行流程 1mysql> update T set c=c+1 where ID=2; 客户端通过连接器连接 MySQL 服务器 将缓存中相关表的结果清空 分析器通过词法和语法分析判断是更新语句 优化器通过索引,决定使用 ID 的索引 执行器执行更新语句 进行 redo log 和 bin log 的修改 2.Redo log(引擎日志)情景老板记账:先把借帐和还账记录写在黑板上,空闲时,再把黑板上账的写入到账本中。 作用: 用作数据库写入将数据磁盘的缓存,防止每次更新都要将数据写进磁盘,提高了更新效率。 1. WAL (Write-Ahead Logging)**先写日志,再写磁盘**。 InnoDB 引擎会把记录写道 redo log 中,并更新内存。然后更新就算完成。引擎会在空闲时间操作记录 写入磁盘。 如果 redo log 写满了,会把一部分记录更新到磁盘中。 通过 write pos 和 check point 两个指针来判断日志是否写满 2. crash-safe当数据库发生异常时,可以通过 redo log 可以获取到之前的提交记录。 通过提 ...
了解Mysql查询语句执行流程
MySQL 逻辑架构图 1. Server 层Server 层包括连接器、分析器、优化器、执行器、查询缓存。 1. 连接器作用: 负责跟客户端建立连接 获取权限 维持和管理连接 连接指令 1mysql -h$ip -P$port -u$user -p 获取权限:通过 TCP 握手后,连接器验证身份,通过输入的用户名和密码。查询 MySQL 数据库中的 user 表。查询对应的用户权限。 长连接和短链接 长连接:连接成功后,如果客户端持续有请求,则一直使用该连接 短连接:每次执行完几次查询就断开连接,下次查询在重新建立连接。 建议使用长连接,因为建立连接过程比较复杂,尽量减少建立连接的动作。 但是建立长连接也会导致内存消耗增加。因为 Mysql 在执行时使用的内存是在连接对象里面的。这些资源会在断开时释放。 如果长连接累计下来,可能导致内存占用太大。 解决方法 定期断开长连接 执行 mysql_reset_connectionc 初始化连接资源。针对 5.7 以后。 2. 查询缓存作用:用于做缓存 Mysql 拿到请求后会先去缓存中,查看是否有对应的查询语句。缓存以 key- ...







