侧边栏壁纸
  • 累计撰写 244 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论
隐藏侧边栏

MySQL

kaixindeken
2021-04-23 / 0 评论 / 3 点赞 / 202 阅读 / 1,126 字

整体架构

数据库安装和服务端启动原理
数据库连接原理与性能优化
服务端整体架构和查询语句的执行流程
SQL 更新语句的执行流程与日志写入
当我们创建数据库和数据表时底层在做什么

索引和查询优化

数据库索引底层数据结构 —— B+ 树
不同类型的数据库索引 B+ 树是如何维护的
全值匹配查询时索引的使用与最左前缀原则的底层原理
范围匹配查询时索引的使用和 explain 结果字段解析
带分页、排序和分组统计的查询如何使用索引进行优化
内外连接查询的底层原理及如何使用索引进行性能优化
子查询的底层执行策略及如何使用索引进行性能优化

查询小技巧分享:对于 count 聚合查询,有同学可能会好奇到底使用 count() 还是 count(id) 查询性能好一些,对于 InnoDB 引擎而言,MySQL 专门对 count() 做了优化,而 count(id) 则会进行全表扫描,再逐行累加,因此推荐使用 count(*)。有人可能会困惑,为啥 InnoDB 不像 MyISAM 那样把全表记录数记录下来,因为 InnoDB 支持事务,而事务里面有个 MVCC 机制(下面的事务篇里面会详细介绍),每条记录可能同时存在多个版本,因此,具体有多少行是不确定的。另外,对于经常需要计数的表字段,我们在设计数据表时会基于反范式设计通过冗余字段来存储,比如文章浏览数、视频观看数、商品购买数等,或者通过缓存系统来保存,这些手段都是为了提升查询性能。

数据库事务

注:以下事务篇教程仅限 InnoDB 引擎。

Buffer Pool
MySQL 数据库事务简介与 ACID 特性
通过 redo 日志保证数据库事务的持久性
通过 undo 日志保证数据库事务的原子性
并发事务存在的问题和 MySQL 事务隔离级别
通过 MVCC 机制保证数据库事务的一致性
MySQL 中的全局锁、表锁和行锁(共享锁、排它锁、意向锁、死锁)
悲观锁、乐观锁和数据库事务隔离性的实现

MySQL 事务如何在可重复读级别解决幻读问题:我们知道 InnoDB 支持行锁,在更新(修改/删除)某一行之前可以先通过行锁进行加锁操作,但是对于插入操作而言,事先插入的行是不存在的,也就无法加行锁,为此 MySQL 引入了一个间隙锁(Gap Lock)的概念,即对待插入的行与行之间的间隙进行加锁(两端是(-∞,MIN) 和 (MAX,+∞)),一个相邻的间隙锁和行锁合起来形成一个 Next-key Lock,它是一个前开后闭的区间(间隙锁+行锁),Next-key Lock 是 MySQL 加锁的基本单位,并且查询过程中访问到的对象才会加锁,如果一个 SQL 加锁语句查询条件包含唯一索引(包括主键)的等值查询,则该锁退化为行锁,因此对于一个插入语句而言,由于设置了 Next-key Lock,因此可以阻塞其他事务对对应行和间隙的读操作,从而避免了幻读问题。

0

评论区