明天争取
听一首好歌,写一段代码,阅生活百态。
展开
-
MySQL 的基础架构
1、MySQL逻辑架构2、Server层2.1、连接器2.1.1、职责连接器负责跟客户端建立连接、获取权限、维持和管理连接。2.1.2、与客户端交互过程(1)输入连接命令mysql -h$ip -P$port -u$user -p(2)在交互对话里面输入密码(3)如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。(4)如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑.原创 2022-04-03 10:00:26 · 79 阅读 · 0 评论 -
InnoDB引擎架构
1、架构总览2、Buffer Pool(缓冲池)介绍缓冲池就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“Fix”在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池,则称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。对于数据库中页的修改操作,则首先修改缓冲池中的页,然后再以一定的频率刷新到磁盘上。缓冲池中页默认大小为16K。页从缓冲池中刷新回磁原创 2022-04-03 16:15:23 · 1589 阅读 · 0 评论 -
谈谈MySQL的WAL、LSN、checkpoint
谈谈MySQL的WAL、LSN、checkpoint原创 2022-04-04 16:29:16 · 615 阅读 · 0 评论 -
归档日志(binlog)介绍
1、binlog(归档日志)1.1、日志内容记录了对MySQL数据库执行更改的所有操作。但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。然而若操作没有导致数据库发生变化,并不意味着该操作不会写入二进制日志。1.2、binlog的作用恢复mysqlbinlog可以使用start-datetime/stop-datetime选取某个时间段内的日志,或者start-position/stop-position选取某个log_pos范围内的日志。这一点可以用原创 2022-04-04 18:37:09 · 1272 阅读 · 0 评论 -
重做日志(redo log)介绍
1、重做日志(redo log)1.1、定义redo log是物理日志,记录的是页的物理修改操作。1.2、功能保证事务的原子性和持久性。redo log用来恢复提交事务修改的页操作。1.3、组成1.4、数据结构重做日志缓存(redo log buffer)由每个512字节大小的日志块(log block)组成。日志块由三部分组成,依次为日志块头(log block header)、日志内容(log body)、日志块尾(log block tail)。重做日志文件原创 2022-04-06 11:20:31 · 828 阅读 · 0 评论 -
回滚日志(undo log)介绍
1、定义在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。undo是逻辑日志,记录了与实际操作语句相反的操作,目的是将数据库逻辑地恢复到原来的样子。但是数据结构和页本身在回滚后可能与原来大不相同。2、功能提供数据回滚当事务回滚时或者数据库崩溃时,可以利用 undo log来进行数据回滚。多个行版本控制(MVCC)当用户读取一行记录时,若该行记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信原创 2022-04-08 14:50:20 · 3205 阅读 · 2 评论 -
归档日志(binlog)和重做日志(redo log)的区别?
redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。 redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。...原创 2022-04-07 21:19:58 · 438 阅读 · 0 评论 -
MySQL如何保证 binlog 和 redo log 的一致性
1、分布式事务(XA)1.1、两阶段提交在分布式事务处理中,全局事务(global transaction)会访问和更新多个局部数据库中的数据,如果要保证全局事务的原子性,执行全局事务 T 的所有节点必须在执行的最终结果上取得一致。X/Open 组织针对分布式事务处理而提出了 XA 规范,使用两阶段提交协议(two-phase commit protocol,2PC)来保证一个全局事务 T 要么在所有节点都提交(commit),要么在所有节点都中止。1.2、提交协议考虑一个全局事务 T 的事原创 2022-04-06 21:51:12 · 783 阅读 · 0 评论 -
MySQL 组提交对内部XA事务的优化
1、技术背景在非只读事务,每次事务提交时需要进行一次fsync操作,然而磁盘的fsync性能有限。为了提高磁盘的fsync的效率,数据库提供了group commit的功能,即一次fsync可以刷新多个事务日志被写入文件。2、组提交(group commit)2.1、事务提交的顺序MySQL 的内部 XA 机制保证了单个事务在 binlog 和 InnoDB 之间的原子性,那么,在多个事务并发执行的情况下,怎么保证在 binlog 和 redolog 中的顺序一致?2.2、早期解决方法原创 2022-04-07 16:35:07 · 571 阅读 · 0 评论 -
MySQL内部不使用XA事务存在的问题
MySQL使用内部XA保障了binlog和redo log数据的一致性。如果不用两阶段提交,由于 redo log 和 binlog 是两个独立的逻辑,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。那这两种方式会有什么问题呢?假设数据库正在执行更新操作(c的默认值为0):update T set c=c+1 where ID=2;1、binlog和redo log数据不一致问题1.1、先写 redo log 后写 binlog。...原创 2022-04-07 11:03:38 · 204 阅读 · 0 评论 -
MySQL事务介绍
1、什么是事务?事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。2、事务特性2.1、原子性(Atomicity)事务中的所有操作要么全部成功,要么全部失败。2.2、一致性(consistency)事务开始前和事务结束后,数据库的完整性约束没有被原创 2022-04-09 20:10:21 · 967 阅读 · 0 评论 -
数据库表空间介绍
1、表结构组成一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,2、表空间文件查看表空间文件表示ibdata1文件的大小为12M,如果用完了这12M,该文件可以自动增长(autoextend)。设置innodb_data_file_path参数后,所有基于InnoDB存储引擎的表数据都会记录到该共原创 2022-04-10 21:05:39 · 1481 阅读 · 1 评论 -
MySQL的“锁”事一览(一)
1、锁设计背景数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。2、锁的分类根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。2.1、全局锁2.1.1、定义全局锁就是对整个数据库实例加锁。2.1.2、实现MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于原创 2022-04-11 16:50:59 · 994 阅读 · 0 评论 -
MySQL的“锁”事一览(二)
1、锁问题1.1、脏读事务T1修改了一行数据,事务T2在事务T1提交之前读到了该行数据。1.2、不可重复读事务T1读取了一行数据。 事务T2接着修改或者删除了改行数据,当T1再次读取同一行数据的时候,读到的数据是修改之后的或者发现已经被删除。1.3、幻读事务T1读取了满足某条件的一个数据集,事务T2插入了一行或者多行数据满足了T1的选择条件,导致事务T1再次使用同样的选择条件读取的时候,得到了比第一次读取更多的数据集。1.4、脏读和不可重复读的区别脏读是读到未提交的数据,而不原创 2022-04-13 17:25:53 · 297 阅读 · 0 评论 -
MySQL索引探究(一)
1、索引定义索引是存储引擎用于快速定位记录的⼀种数据结构。索引类似于书籍的目录,想找到一本书的某个特定的主题,需要先找到书的目录,定位对应的页码。MySQL 中存储引擎使用类似的方式进行查询,先去索引中查找对应的值,然后根据匹配的索引找到对应的数据行。2、索引类型B+树索引 全文索引 哈希索引InnoDB存储引擎支持的哈希索引是自适应的,即自适应哈希索引。其根据表的使用情况自动为表生成哈希索引,不能人为干预。3、索引结构MySQL数据库索引采用的是B+Tree结构,在B-Tre原创 2022-04-18 09:58:15 · 636 阅读 · 0 评论 -
MySQL索引探究(二)
1、理论基础1.1、局部性原理对于应用程序来讲,有这样一种趋势,程序总是趋向于访问最近已经使用过的指令或数据,或者附近的指令或数据。从两个纬度分析,时间局部性原理:这个指令或数据刚刚被用过,在不远的时间内可能被再次用到;空间局部性原理:刚刚访问的指令数据,其附近的指令数据在不远的时间内被访问到。1.2、磁盘预读程序运行期间所需要的数据通常比较集中。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。预读的长度原创 2022-04-18 17:21:11 · 502 阅读 · 0 评论 -
MySQL优化实践指南
1、优化方法论1.1、自顶向下,分层优化整体:客户端、WEB端、数据库缓存、连接池、MySQL数据库分层:SQL层>MySQL层>InnoDB层>硬件层 层次 业务层 物理层 优化策略 第一层 查询需求 SQL层 减少查询 第二层 查询优化器 MySQL层原创 2022-04-15 14:58:45 · 589 阅读 · 0 评论 -
MySQL查询之文件排序
1、定义MySQL查询通过索引进行排序。当不能使用索引生成排序结果的时候,MySQL就需要自己进行排序。如果数据量小则在内存中进行,如果数据量大则需要使用磁盘,MySQL将这个过程称为文件排序(filesort)。2、排序缓冲(sort_buffer)“ 排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数 sort_buffer_size。sort_buffer_size,就是 MySQL 为排序开辟的内存(sort_buffer)的大小。如果要排序的数据原创 2022-05-01 19:00:05 · 1112 阅读 · 0 评论 -
MySQL查询之join用法
1、什么是straight_join?straight_join功能同join类似,但能让左边的表来驱动右边的表,能改表优化器对于联表查询的执行顺序。straight_join 让 MySQL 使用固定的连接方式执行查询,这样优化器只会按照我们指定的方式去 join。2、join算法CREATE TABLE `n2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PR原创 2022-05-02 21:15:31 · 674 阅读 · 0 评论 -
MySQL查询之内存临时表
1、什么是临时表?MySQL用于存储一些中间结果集的表,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。2、临时表分类?临时表分为两种,一种是内存临时表,一种是磁盘临时表。内存临时表采用的是memory存储引擎,磁盘临时表采用的是myisam存储引擎(磁盘临时表也可以使用innodb存储引擎,通过internal_tmp_disk_storage_engine参数来控制使用哪种存储引擎,从mysql5.7.6之后默认为innodb存储引擎,之前版本默认为myisa原创 2022-05-08 21:30:36 · 2515 阅读 · 0 评论 -
MySQL用count(*)查询总记录数真的很慢吗?
1、不同存储引擎count(*) 的实现方式在不同的 MySQL 引擎中,count(*) 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高; 而 InnoDB 引擎它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里讨论的是没有过滤条件的 count(*),如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的。2、InnoDB 为啥把总记录数存起来呢?2原创 2022-05-15 11:14:59 · 593 阅读 · 1 评论