随笔分类 -  MySQL

MySQL 系列笔记,包括原理、主从同步、读写分离、连接池等
摘要:一、Explain的作用 explain 命令主要用于查看 SQL 语句的执行计划,该命令可以模拟优化器执行 SQL 查询语句,可以帮助我们编写和优化 SQL。那么 explain 具体可以提供哪些信息,帮助我们如何去优化 SQl 的呢? 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些 阅读全文
posted @ 2022-08-04 11:17 维维尼~ 阅读(919) 评论(0) 推荐(0) 编辑
摘要:一个好的索引设计,就是尽量让所有查询都以索引查询的形式进行,以提高查询效率。在之前提到过,使用主键查询会直接走聚簇索引,使用复合索引字段查询可能会回表,并且在使用复合索引时尽量遵循 “最左侧原则” ,这样才能大大提高索引的使用率,提高查询效率。 索引排序 前面说的都是在 where 条件中使用索引作 阅读全文
posted @ 2022-08-03 17:21 维维尼~ 阅读(177) 评论(0) 推荐(0) 编辑
摘要:索引页 现在我们知道,innodb 会把每个数据页最小主键和所在数据页组成一个主键目录,然后根据主键查找记录时,在主键目录上使用二分法即可快速查找到记录所在的数据页。可是在数据量极大的场景下,数据页数量会极大,然后主键目录也会很大,如果还是使用这种方式也是不可取的。 所以实际上 innodb 会把索 阅读全文
posted @ 2022-08-03 16:58 维维尼~ 阅读(56) 评论(0) 推荐(0) 编辑
摘要:数据页的物理存储 数据行是存放在数据页中的,而实际上数据页在磁盘文件中就是一些连续的数据,数据页之间通过两个上下指针连接指向前后数据页的物理地址,形成双向链表。然后数据页中存储的数据行按照主键大小排序存储,每一行数据都保存一个指针指向下一行数据位置,形成单向链表。 数据页的页目录 之前说过,数据页的 阅读全文
posted @ 2022-08-03 16:49 维维尼~ 阅读(34) 评论(0) 推荐(0) 编辑
摘要:之前提到过一种导致数据库性能抖动的异常,是由于系统 RAID 磁盘阵列的蓄电池定时充放电,导致 IO 不经过缓存直接写磁盘造成一段时间内数据库性能急剧下降。还有一种情况就是在高并发写的同时查询大量数据导致的性能抖动。 刷盘 如果要修改某条数据,首先要做的是从磁盘加载数据页到 Buffer pool 阅读全文
posted @ 2022-08-03 16:43 维维尼~ 阅读(192) 评论(0) 推荐(0) 编辑
摘要:SQL 标准事务隔离级别 SQL 标准中规定了 4 种事务隔离级别,在多事务并发时可以避免一些事务并发问题。 read uncommitted read uncommitted(读未提交):简称 RU 级别,这个隔离级别是不允许脏写发生的,也就是说不允许两个事务在没提交的情况下去更新同一行数据,却允 阅读全文
posted @ 2022-08-03 16:34 维维尼~ 阅读(64) 评论(0) 推荐(0) 编辑
摘要:所谓“事务”,一般具有四个属性:原子性、一致性、隔离性、持久性。即一个事务是不可分割的工作单元,一个事务内的操作要么全部成功、要么全部失败。 事务问题 对于一个单线程事务,如果成功就提交,如果失败则回滚。可是 MySQL 的事务是多线程并发的,对于缓存页中的一行数据,可能有多个事务在对其进行修改、查 阅读全文
posted @ 2022-08-03 16:05 维维尼~ 阅读(263) 评论(0) 推荐(0) 编辑
摘要:redo log MySQL 在执行增删改时会写入一条日志到 redo log 日志文件中,以保证事务提交后,修改的数据一定不会丢失。因为就算事务提交后,数据库宕机了,MySQL 也能根据 redo log 来恢复宕机前修改的数据,再把数据刷回磁盘。可是为什么不在宕机前直接把修改的数据刷回磁盘呢?因 阅读全文
posted @ 2022-08-03 15:41 维维尼~ 阅读(52) 评论(0) 推荐(0) 编辑
摘要:磁盘读写 MySQL 执行增删改查需要读取数据页到 buffer pool ,SQL 执行过程中还会写入日志。读取数据页的操作属于随机读写,操作系统的磁盘 IOPS 和响应延迟直接影响数据库执行 crud 时随机读写的性能。而日志的写操作是基于操作系统磁盘的顺序读写操作,在 redo 日志文件尾部追 阅读全文
posted @ 2022-08-03 15:38 维维尼~ 阅读(137) 评论(0) 推荐(0) 编辑
摘要:数据页 数据页实际上是由多个部分组成的,包括文件头、数据页头、最小记录和最大记录、多个数据行、空闲空间、数据页目录、文件尾部。其中数据行中包含了两行伪记录 Infimum 和 Supremum,Infimum(下确界)记录比该页中任何主键值都要小的值,Supremum (上确界)记录比该页中任何主键 阅读全文
posted @ 2022-08-03 15:25 维维尼~ 阅读(213) 评论(0) 推荐(0) 编辑
摘要:现在我已经知道了,MySQL 的每行数据都存储在数据页上,那为什么需要数据页呢?实际上是为了提高数据的读取效率,把读取的指定数据所在数据页中的其他数据行都一次性写入缓存,避免频繁的磁盘 IO 读取数据。那么每行数据又是如何存储的?又如何知道数据在哪个数据页?在哪个数据区?在哪个表空间呢? 行格式 实 阅读全文
posted @ 2022-08-03 15:14 维维尼~ 阅读(57) 评论(0) 推荐(0) 编辑
摘要:MySQL 高并发场景下会使用多线程来处理请求,然后访问存储在 Buffer Pool 中的共享缓存页,多个线程访问同一个 Buffer Pool 资源必然是要加锁来进行的。虽然对数据的查询、更新等操作都是在内存中进行的,即使加锁性能也是可以的。但如果大量请求需要通过磁盘加载数据到缓存,就需要进行磁 阅读全文
posted @ 2022-08-03 15:11 维维尼~ 阅读(94) 评论(0) 推荐(0) 编辑
摘要:缓存淘汰 现在我知道数据页要加载到缓存,需要通过 free 链表找到一个空闲的缓存页,然后把数据写入缓存页。但是缓存页的数量是有限的,当缓存页用尽了该咋办呢?应该通过一定的机制把一些缓存页刷回磁盘,空闲一些缓存页出来。那么哪些缓存页需要被刷入磁盘呢?当然是那些不经常使用的缓存页给刷入磁盘啦,这时就需 阅读全文
posted @ 2022-08-03 15:05 维维尼~ 阅读(197) 评论(1) 推荐(0) 编辑
摘要:脏数据页 基于 free 链表找到一块空闲的缓存页写入数据后,然后更新了这个缓存页,此时缓存页中的数据就与磁盘中的数据页不一致了,那么这个缓存页就是脏数据或者说脏页。最终在内存里更新的这些脏页是会被刷入磁盘的,但是不可能所有的缓存页都刷入磁盘,因为有些缓存页根本没有更新过。所以需要一个数据结构来保存 阅读全文
posted @ 2022-08-03 14:56 维维尼~ 阅读(94) 评论(0) 推荐(0) 编辑
摘要:Buffer pool 是 InnerDB 存储引擎的一个重要组件,MySQL 的所有 CRUD 操作都是围绕 Buffer pool 进行的。现在只知道 Buffer pool 是一个缓冲池,里面存放了磁盘数据的缓存,那么 Buffer pool 是一个什么样的结构,是如何在 SQL 执行过程中起 阅读全文
posted @ 2022-08-03 14:53 维维尼~ 阅读(157) 评论(0) 推荐(0) 编辑
摘要:SQL 语句的最终执行者是存储引擎。存储引擎在经解析器、优化器处理后被执行器调用其接口执行优化后的执行计划。MySQL 存储引擎包括 InnoDB、Myisam、Memory、Archive、CSV 存储引擎等,其中最常用也是MySQL 默认的存储引擎是 InnoDB。 写入缓冲池(Buffer p 阅读全文
posted @ 2022-08-01 16:29 维维尼~ 阅读(73) 评论(0) 推荐(0) 编辑
摘要:在了解 MySQL 原理之前,对我而言 MySQL 就是一个黑盒子,我写的SQL 语句通过服务发送给 MySQL 数据库,然后数据库就执行 SQL 语句,返回一些查询结果或做一些操作。然后就没然后了。。。再深入一点,就是知道某些 SQL 的写法会降低数据库执行效率,也就是需要所谓的 SQL 优化。但 阅读全文
posted @ 2022-08-01 16:19 维维尼~ 阅读(141) 评论(0) 推荐(0) 编辑
摘要:一、磁盘压测 磁盘的性能直接影响 MySQL 的吞吐量。磁盘的随机 IO 性能越高,刷盘速度越快。这里磁盘压测选择 fio 进行测试,fio 可以使用命令 yum install fio 安装在 linux 上,也可以在官网下载 windows 版本,使用 fio 命令进行相关测试。 1. 安装 l 阅读全文
posted @ 2022-08-01 14:48 维维尼~ 阅读(903) 评论(0) 推荐(0) 编辑
摘要:一、添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> <dependen 阅读全文
posted @ 2022-08-01 14:38 维维尼~ 阅读(400) 评论(0) 推荐(0) 编辑
摘要:自定义读写分离 基于 druid 连接池自定义配置做一主多从的读写分离配置,做读写分离的前提是数据库集群已做好主从同步配置。这里默认已经完成主从同步的配置,读写分离环境为: JDK:1.8+ ORM:JPA DB:MySQL 5.7+ 添加 maven 依赖 这里主要添加 MySQL 驱动依赖和 d 阅读全文
posted @ 2022-08-01 13:57 维维尼~ 阅读(181) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示