高性能 MySQL [笔记]-架构与历史

1. MySQL逻辑架构


高性能MySQL【笔记】-架构与历史

上图就是MySQL的逻辑架构:

  • 第一层服务并不是MySQL独有的,大多数是基于网络的客户端 / 服务器的工具或者服务都有类似的架构,例如连接处理、授权认证、安全等等一些功能,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。。
  • 第二层是MySQL的核心服务,例如查询解析、分析、优化、缓存以及所有的内置函数(日期、时间、数字函数),以及所有跨引擎的一些功能实现:存储过程、触发器、视图等
  • 第三层主要是MySQL存储引擎,主要负责MySQL中数据的存储及提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎API包含了几十个底层函数,用于执行 ”开始一个事务“ 或者 ”根据主键提取一行记录等操作“。 另外不同存储引擎之间也不会相互通信,只是简单响应上层服务器的请求。现在主要使用的存储引擎有:InnoDB、MyISAM

1.1 优化与执行

MySQL 会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊的关键字提示(hint)优化器,影响它的决策进程。也可以使用优化器解释(explain)优化过程的各个因素,便于用户重构查询、修改相关配置,使应用尽可能高效运行。

对于SELECT语句,在解析查询之前,服务器会先检查查询缓存(Query Cache),如果能够找到对应查询,直接返回查询缓存中的结果集

2. 并发控制

无论什么时候,只要有多个查询或多个修改在同时产生,都会产生并发控制的问题。

2.1 读写锁

示例场景:假设有一张表,在同一时刻被多个用户并发读取,同时有另外一个用户在进行删除或修改某条记录,这个时候多个用户读取数据会和实际数据库的数据发生不一致的情况。那该类情况下该如何处理。该类经典问题的解决方法就是并发控制。

  • 处理方式:在处理并发读或写的时候,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(shared lock) 和排它锁(exclusiv lock) ,也就读锁(read lock) 和写锁(write lock)。

  • 锁的概念:读锁是共享的,或者说是相互不阻塞的。多个用户在同一时刻可以同时读取同一个资源,而相互不干扰。写锁是排他的,一个写锁会阻塞其他的写锁和读锁,只有这样,才能确保在给定的时间内,只有一个用户能执行写入。

2.2 锁粒度

问题:加锁可解决并发读或并发写处理,但同时加锁也需要消耗资源。锁的各种操作,包括获得锁、检查锁是否已经解决、释放锁等,都会增加系统的开销。所以一般数据库会提供多种锁策略供使用者选择,在锁的开销和数据的安全性之间寻求平衡

2.2.1 表锁 (table lock)

表锁是MySQL中最基本的锁策略,并且是开销最小的策略,它会锁定整张表。一个用户在对标进行写操作(insert、delete、update等)前,需要先获取写锁,阻塞其他用户对该表的读写操作。只有没有写锁时,其他用户才能获取读写。另外读锁之间是不相互阻塞的。

ps:写锁笔读锁拥有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面

2.2.2 行锁 (row lock)

行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销),行级锁只在存储引擎层实现。

3. 事务

概念:事务就是一组原子性的SQL查询,或者说一个独立的工作单元。事务内的语句,要么全部执行成功,要么全部执行失败。一个好的事务处理系统,必须具备ACID特征

  • 原子性(atomicity):一个事务必须是一个不可分割的最小工作单元,整个事务的操作要么全部提交成功,要么全部失败回滚。不可能只执行其中一部分操作,这就是事务的原子性
  • 一致性(consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态。不存在部分状态调整。
  • 隔离性(isolation):一个事务所做的修改在最终提交前,对其他事务是不可见的。
  • 持久性(durbility):一旦事务提交,其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。不同的持久性策略有不同的持久性级别,后续待介绍

ps:就像锁粒度的升级或增加系统开销一样,这种事务处理过程中额外的安全性,也会需要数据库系统做更多额外的工作。一个实现ACID的数据库,相比没有实现的ACID数据库,通常会需要更强的CPU处理能力,更大的内存和更多的磁盘空间。

4. MySQL历史

历史介绍

本作品采用《CC 协议》,转载必须注明作者和本文链接
会飞的大象
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!