MySQL(八):读懂MVCC多版本并发控制

mysql在并发的情况下,会引起脏读,幻读,不可重复读等一系列的问题,为解决这些问题,引入了mvcc的机制。本文就详细看看mvcc是怎么解决脏读,幻读等问题的。

1、 数据库事务

1.1 事务

事务是操作数据库的最小单元,将【多个任务作为单个逻辑工作单元】执行的一系列数据库操作,他们作为一个整体一起向数据库提交,要么都执行、要么都不执行。

阅读更多

MySQL(七):一文详解六大日志

日志一般分为逻辑日志与物理日志两类

  • 「逻辑日志」:即执行过的事务中的sql语句,执行的sql语句(增删改)「反向」的信息
  • 「物理日志」mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页变更 。

mysql数据库中日志是重要组成部分,记录着数据库运行期间各种状态信息」。主要有6类:

  • 二进制日志
  • 重做日志
  • 撤销日志
  • 错误日志
  • 查询日志
  • 中继日志
阅读更多

MySQL六:InnoDB数据文件

一、数据文件的组成

innodb数据逻辑存储形式为表空间,而每一个独立表空间都会有一个.ibd数据文件,ibd文件从大到小组成:

一个ibd数据文件–>Segment(段)–>Extent(区)–>Page(页)–>Row(行)图片

  • 表空间(Tablesapce)

    表空间,用于存储多个ibd数据文件,用于存储表的记录和索引,一个文件包含多个段。

  • 段(Segment)

    段由数据段、索引段、回滚段组成,innodb存储引擎索引与数据共同存储,数据段即是B+树叶节点,索引段则存储非叶节点

  • 区(Extent)

    区则是由连续页组成,每个区的大小为1M,一个区中一共有64个连续的页

  • 页(Page)

    页是innodb存储引擎磁盘管理的最小单位,页的大小为16KB,即每次数据的读取与写入都是以页为单位

    包含很多种页类型,比如数据页,undo页,系统页,事务数据页,大的BLOB对象页

阅读更多

MySQL五:InnoDB线程模型

一、InnoDB线程模型的组成

在Innodb存储引擎中,后台线程的主要作用是「负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据」。此外它会将已经修改的数据文件刷新到磁盘文件中,保证在发生异常的情况下,Innodb能够恢复到正常的运行状态。

阅读更多

MySQL四:InnoDB的存储结构

「MySQL存储引擎最大的特点就是【插件化】,可以根据自己的需求使用不同的存储引擎,innodb存储引擎支持行级锁以及事务特性,也是多种场合使用较多的存储引擎。」

当官方的存储引擎不足以满足时,我们通过抽象的API接口实现自己的存储引擎。

抽象存储引擎API接口是通过抽象类handler来实现,handler类提供诸如打开/关闭table、扫表、查询Key数据、写记录、删除记录等基础操作方法。

每一个存储引擎通过继承handler类,实现以上提到的方法,在方法里面实现对底层存储引擎的读写接口的转调。

阅读更多

MySQL三:存储引擎

一、MySQL存储引擎概述

「数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据」。不同的存储引擎提供不同的存储机制、索引、锁等功能。许多数据库管理系统都支持多种不同的数据引擎。

在关系数据库中数据的存储是以表的形式存储的,所以「存储引擎也可以称为表类型(Table Type,即存储和操作此表的类型)」

阅读更多

MySQL二:SQL运行机制

MySQL用了很久,但是一直也是工作的使用,对于MySQL的知识点都比较零散碎片,一直也没有整体梳理过,趁着最近不忙,梳理一下相关的知识点。

一、 MySQL的起源

MySQL是一个开源的关系数据库管理系统。原开发者为瑞典的 MySQL AB公司,2008 年AB公司被Sun公司收购,并发布收购之后的首个版本 MySQL5.1。2010 年 Oracle 收购 Sun 公司,至此MySQL归入Oracle门下,之后发布了收购以后的首个版本 5.5 。

  • MySQL5.1 ,该版本引入分区、基于行复制以及plugin API 。
  • MySQL 5.5 ,改善集中在性能、扩展性、复制、分区以及对 windows 的支持。

图片

阅读更多

MySQL一:架构体系

我们一般都不会去操作数据库本身,「而是通过SQL语句调用MySQL,由MySQL处理并返回执行结果」。那么SQL语句是如何执行sql语句的呢?

Sql语句执行过程图解:

图片

阅读更多

说说MySQL读写分离的原理?主从同步延时咋解决?

1、面试题

你们有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题?

2、面试官心里分析

这个,高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗?

阅读更多

线上服务器进行分库分表(达到亿级数据)

如何设计可以动态扩容缩容的分库分表方案?

  • (1)选择一个数据库中间件,调研、学习、测试
  • (2)设计你的分库分表的一个方案,你要分成多少个库,每个库分成多少个表,3个库每个库4个表
  • (3)基于选择好的数据库中间件,以及在测试环境建立好的分库分表的环境,然后测试一下能否正常进行分库分表的读写
  • (4)完成单库单表到分库分表的迁移,双写方案
  • (5)线上系统开始基于分库分表对外提供服务
  • (6)扩容了,扩容成6个库,每个库需要12个表,你怎么来增加更多库和表呢?
阅读更多