企业网站及公众号建设方案/俄罗斯搜索引擎yandex官网入口
一.MySQL的逻辑架构

最上层的客户端所包含的服务并不是MySQL独有的,大多数基于网络的客户端/服务器工具或服务器都有类似的服务,包括连接处理、身份验证、确保安全性等。
第二层是比较有意思的部分。大多数MySQL的核心功能都在这一层,包括查询解析、分析、优化、以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能也都在这一层实现:存储过程、触发器、视图等。
第三层是存储引擎层。存储引擎负责MySQL中数据的存储和提取。和GNU/Linux下的各种文件系统一样,每种存储引擎都有其优势和劣势。服务器通过存储引擎API进行通信。这些API屏蔽了不同存储引擎之间的差异,使得它们对上面的查询层基本上是透明的。存储引擎层还包含几十个底层函数,用于执行诸如“开始一个事务”或者“根据主键提取一行记录”等操作。但存储引擎不会去解析SQL(InnoDB是一个例外,它会解析外键定义,因为MySQL服务端没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单地响应服务器的请求。
连接管理与安全性
默认情况下,每个客户端连接都会在服务器进程中拥有一个线程,该连接的查询只会在这个单独的线程中执行,该线程驻留在一个内核或者CPU上。服务器维护了一个缓存区,用于存放已就绪的线程,因此不需要为每个新的连接创建或者销毁线程。
优化与执行
MySQL解析查询以创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊关键字向优化器传递提示,从而影响优化器的决策过程。也可以请求服务器解释优化过程的各个方面,使用户可以知道服务器是如何进行优化决策的,并提供一个参考点,便于用户重构查询和schema、修改相关配置,使应用尽可能高效地运行。
优化器并不关心表使用的是什么存储引擎,但存储引擎对于查询优化是有影响的。优化器会向存储引擎询问它的一些功能、某个具体操作的成本,以及表数据的统计信息。例如,一些存储引擎支持对某些查询有帮助的特定索引类型。
在旧版本中,MySQL可以使用内部查询缓存(query cache)来查看是否可以直接提供结果。但是,随着并发性的增加,查询缓存成为一个让人诟病的瓶颈。从MySQL 5.7.20版本开始,查询缓存已经被官方标注为被弃用的特性,并在8.0版本中被完全移除。
一个流行的设计模式是在memcached或Redis中缓存数据。
二.并发控制
无论何时,只要有多个查询需要同时修改数据,就会产生并发控制问题。MySQL提供两个级别的并发控制:服务器级别与存储引擎级别。这里只简要地介绍MySQL如何控制并发读写。
我们用一个传统的电子表格文件作为示例,来说明MySQL如何处理同一组数据上的并发工作。电子表格由行和列组成,很像数据库中的表。假设文件在只有你可以访问的笔记本电脑上,没有潜在的冲突,因为只有你可以对该文件进行更改。现在,想象一下你需要与一位同事合作制作电子表格,文件存放在一个你们都可以访问的共享服务器上。当你们需要同时对该文件进行更改时,会发生什么情况?如果还有一整个团队的人积极地尝试编辑、添加和删除这个电子表格中的单元格内容,那会怎么样呢?我们可以说他们应该轮流修改,但这样效率是极低的。我们需要一种允许并发访问大容量电子表格的方法。
读写锁
如果把上述电子表格看作数据库中的表,很容易发现也会有同样的问题。从很多方面来说,电子表格就是一张简单的数据库表。修改数据库表中的记录,和删除或者修改电子表格文件中的单元格内容十分类似。
并发控制这一经典问题的解决方案相当简单。处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统。这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。
先不考虑具体的锁定机制,锁的概念可以如下描述:资源上的读锁是共享的,或者说是相互不阻塞的。多个客户端可以同时读取同一个资源而互不干扰。写锁则是排他的,也就是说,一个写锁既会阻塞读锁也会阻塞其他的写锁,这是出于安全策略的考虑,只有这样才能确保在特定的时间点只有一个客户端能执行写入,并防止其他客户端读取正在写入的资源。