写点什么

2020 年 6 月 11 日 高性能 MySQL

发布于: 2020 年 06 月 11 日

从这里开始讲开始一个新的篇章,往后几个章节的能容都是出自于《高性能MySQL》这本书,主要是对mysql架构进行学习。第一章主要是关于Mysql架构和历史,主要目的就是对于Mysql有一个整体的把握,目睹MySQL的整个架构体系,然后逐步深入。

第一章 MySQL架构与历史

1、MySQL逻辑架构

首先需要在脑海中构建出一幅MySQL各组件之间如何工作的架构图:

最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务端的工具或者服务都有类似的架构

第二层是MySQL的核心服务功能,包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等

第三层包含了存储引擎,存储引擎负责MySQL中数据的存储和提取

1、连接管理与安全性

每个客户端连接都会在服务器进程中拥有一个线程,这个连接查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或销毁线程。

2、优化与执行

MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读写顺序,以及选择合适的索引等

2、并发控制

1、读写锁

在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁和拍他锁,也叫读锁和写锁。

读锁是共享的

写锁是拍他的

2、锁粒度

一种提高共享资源并发性的方式就是让锁定对象更具有选择性,更理想的方式是只会对修改的数据片进行精确的锁定。任何时候,在给定的资源上,锁定的数量越少,则系统的并发程度越高。



所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡,这种平衡也会自然影响到性能。一般都是在表上施加行级锁

表锁:表锁是MySQL中最基本的锁策略,并且是开销最小的策略。

一个用户在对表进行写操作之前需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。

另外,写锁比读锁有更高的优先级,因此一个写请求可能会被插入到读锁对列里面。

行锁:行锁可以最大程度的支持并发处理

行锁只在存储引擎层实现,而没有在MySQL服务层实现

3、事务

ACID表示原子性 、一致性、隔离性和持久性

原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的操作要么全部成功,要么全部失败回滚。

一致性:数据库总是从一个一致性状态转换到另一个一致性状态。

隔离型:一个事务所做的修改在最终提交以前,对其他事物是不可见的

持久性:一旦事物提交,则其所做的修改就会永久的保存到数据库中。



1、隔离级别

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的

READ UNCOMMITTED (未提交读):

在该级别中,事务中的修改即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。

READ COMMITED (提交读)

一个事务开始时,只能“看见”已经提交的事务所做的修改,这个级别也叫不可重复读

REPETABLE READ (可重复度)

该级别解决了脏读的问题,会出现幻读的问题。所谓幻读,就是当某个事务在读取某个范围内的记录时另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行

SERIALIZABLE(可串行化)

该级别是最高的隔离级别。它是通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁竞争的问题

2、死锁

死锁是指两个或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

锁的行为和顺序和存储引擎是相关的

3、事务日志

事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘中的事务日志中,而不用每次都将修改的数据本身持久化到磁盘中。

事务日志采用的是追加的方式,因此在写日志操作都是磁盘上一小块区域内的顺序I/O

4、MySQL中的事务

MySQL提供了两种事务性存储引擎:InnoDB和NDB Cluster

自动提交

MySQL默认采用自动提交模式。在当前连接中可以通过设置AUTOCOMMIT变量来启用或者禁用自动提交模式;

show variables like 'AUTOCOMMIT';
SET AUTOCOMMIT =1;
-- 1或者ON表示启用,0或者OFF表示禁用

MySQL可以通过执行 SET TRANSACTION ISOLATION LEVEL 命令来设置隔离级别。新的隔离级别会在下一个事务开始的时候生效



显式和隐式锁定:InnoDB采用的是两阶段锁定协议。在事务的执行过程中,随时都有可能执行锁定,锁只有在执行COMMIT 和ROLLBACK 的时候才会释放,并且所有的锁同时在同一时刻释放

4、多版本并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁,基于提供并发性能的考虑它们一般同时都实现了多版本并发控制(MVCC)。

MVCC的实现是通过保存数据在某个时间点的快照来实现的。

不同存储引擎的的MVCC实现是不同的,典型的有乐观锁并发控制和悲观并发控制。

InnoDB的并发控制通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间。当然存储的并不是实际的时间值,而是系统版本号。每开始一个新的事务,系统版本号都会自动的递增。

MVCC只在REPEATABLE READ 和 READ COMMIT两个隔离级别下工作,其他两个隔离级别和MVCC都不兼容。

5、MySQL的存储引擎

在文件系统中,MySQL将每个数据库(schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义。

MySQL使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。

1、InnoDB存储引擎

InnoDB的数据存储在表空间(tablespace)中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成,InnoDB可以将每个表的数据和索引文件放在一个单独的文件中。

InnoDB采用MVCC来支持高并发,其默认个隔离级别是:REPEATABLE READ ,并且通过间隙策略防止幻读的发生

2、MyISAM存储引擎

3、MySQL内建的其他存储引擎

4、第三方存储引擎

5、选择合适的引擎

主要从以下几个方面考虑:

1、事务

2、备份

3、崩溃恢复

4、特有的特性

6、转换表的引擎

有三种方式可以将表的存储引擎转换成另外一种引擎:

1、ALTER TABLE

2、导出和导入:使用mysqldump工具将数据导出文件,然后修改文件中CREATE TABLE语句的存储引擎选项,注意同时修噶表名

3、创建与查询:先创建一个表,然后利用 INSERT ..... SELECT语法来导数据

6、总结

MySQL拥有分层架构。上层是服务器层的服务和查询执行引擎,下层则是存储引擎



发布于: 2020 年 06 月 11 日阅读数: 116
用户头像

还未添加个人签名 2020.05.18 加入

还未添加个人简介

评论

发布
暂无评论
2020年6月11日             高性能MySQL