MySQL系列—3.体系架构
目录
Mysql体系结构
Connectors:
连接池和线程管理:
SQL Interface:
Parser(查询解析器):
Optimizer(优化器):
Caches(缓存):
可插拔的存储引擎:
一条SQL的执行
连接器
分析器
优化器
执行器
Mysql体系结构
Connectors:
MySQL Connector是MySQL提供的⼀组官⽅的数据库连接器,⽤于在不同编程语⾔中连接和 操作MySQL数据库。这些连接器充当数据库驱动程序,提供了与MySQL服务器进⾏通信的接⼝。
连接池和线程管理:
连接池是⼀个保存和复⽤数据库连接的缓冲区。它允许在需要时从池中获取连接,⽽不 是每次请求时都重新创建连接。线程管理是MySQL⽤于处理客户端请求的组件。对于每个客户端连接, MySQL会为其分配⼀个线程来处理查询和其他数据库操作。这⾥会验证⽤户的账号密码。
SQL Interface:
接受客户端发起的 SQL 语句。
Parser(查询解析器):
解析器是MySQL数据库管理系统中的⼀个重要组件,其主要作⽤是解析SQL语句。 解析器负责将⽤户提交的SQL语句转换为MySQL数据库可以理解和执⾏的内部数据结构,以便数据库引擎能 够执⾏相应的操作。
MySQL 解析器作⽤包括:
1. 语法分析:解析器对SQL语句进⾏语法分析,确保其符合MySQL⽀持的SQL语法规范。如果SQL语句有 语法错误,解析器将报告错误信息。
2. 构建查询树:解析器将合法的SQL语句转换为⼀棵查询树(Query Tree)或查询语法树(Syntax Tree)。这颗树结构表示SQL语句的层次结构和语法关系,有助于数据库引擎进⾏后续的优化和执⾏。
3. 表达式分析:解析器负责识别SQL语句中的表达式,包括数学运算、逻辑运算、函数调⽤等。它将表达 式解析为内部表示,以便数据库引擎能够正确执⾏这些表达式。
4. 权限检查:解析器可能涉及到对⽤户权限的检查,确保⽤户有权执⾏提交的SQL语句。这包括对表、列 的访问权限等。
Optimizer(优化器):
MySQL优化器是MySQL中的⼀个关键组件,其主要作⽤是分析和优化SQL查询语 句,以提⾼查询性能。优化器的主要作⽤包括:查询重写、索引选择、连接顺序优化、⼦查询优化等。
Caches(缓存):
MySQL中有多种类型的缓存,⽤于提⾼查询性能和减轻数据库负担。以下是MySQL中常⻅的⼏种缓存:
1. 查询缓存(Query Cache): 查询缓存存储已经执⾏过的查询的结果集,当相同的查询再次被执⾏时,可以直接返回缓 存中的结果,⽽不必再次执⾏查询。 注意: 在MySQL 8.0版本中,查询缓存被移除,因为它在⾼并发和写⼊负载下可能导致性能问 题。
2. InnoDB缓冲池(InnoDB Buffer Pool):InnoDB存储引擎使⽤缓冲池来缓存表数据和索引。这是⼀个内存区域,⽤于存储热点数据,减 少对磁盘的读取次数。
可以通过配置参数 innodb_buffer_pool_size 来调整InnoDB缓冲池的⼤⼩。
可插拔的存储引擎:
以下是 MySQL 中⼀些常⻅的可插拔存储引擎:
1. InnoDB:
特点: 默认的存储引擎,⽀持事务、⾏级锁定、外键等特性,适⽤于事务性应⽤。
适⽤场景: 适⽤于⼤多数 OLTP(联机事务处理)应⽤,要求事务⽀持和数据⼀致性。
2. MyISAM:
特点: 不⽀持事务,表级锁定,适⽤于读密集型操作。
适⽤场景: 适⽤于读操作频繁、写操作相对较少的场景,⽐如数据仓库、⽇志分析等。
3. Memory(或 Heap):
特点: 将表数据存储在内存中,适⽤于需要⾮常快速访问的临时表。
适⽤场景: 适⽤于需要频繁读写的临时数据,但不适合⽤于持久性数据。
除此还支持CSV、Archive、Blackhole、TokuDB等引擎。
⽂件系统:
⽂件系统是计算机系统⽤于组织和存储⽂件的⼀种机制,它提供了⽂件的层次结构、存储管理、 ⽂件访问权限和元数据等功能。⽂件系统通常在存储介质(如硬盘、固态硬盘、光盘等)上创建⼀个逻辑 层,⽤户和应⽤程序可以通过⽂件系统来对⽂件进⾏访问和管理。常⻅的⽂件系统包括:EXT3、EXT4、 XFS。
⽇志:
错误⽇志、慢查询⽇志、General log、Binary Log、Relay log、Redo log 等
SQL的执行
查询缓存
MySQL 8.0 已经删除了
MySQL 拿到一个查询请求后先会在查询缓存中看看是否执行过此语句,之前执行的语句会以 key-value 的形式缓存在内存中,key 是缓存的语句,value 是查询的结果
如果命中缓存则直接将结果返回,如果没有命中则继续执行后面
1.命中率低:请求sql与环境(连接的数据库、协议版本、字符集等)要与缓存完全一致
2.资源消耗大:QC需要缓存最新的数据,所以在数据发生变化时(比如增删改操作)QC就会刷新,这 导致缓存会频繁的写入、擦除,消耗过多资源
3.缓存数据给第三方处理,比如redis
连接器
连接器负责跟客户端建⽴连接、获取权限、维持和管理连接。
# mysql -h127.0.0.1 -uroot -p
如果⽤户名密码不对,会收到⼀个"Access denied for user"的错误。
如果⽤户名密码正确,连接器会从权限表⾥⾯查出⽤户拥有的权限。这就意味着,如果修改了权限,只对新创建的 连接⽣效。
因为建⽴连接的成本⽐较⾼,所以推荐使⽤⻓连接。
mysql> show global status like 'threads%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 19 |
| Threads_connected | 1 |
| Threads_created | 22 |
| Threads_running | 2 |
+-------------------+-------+
4 rows in set (0.00 sec)
分析器
词法分析
将输⼊的SQL语句分解成⼀个个的词(token)。每个词代表语句中的⼀个基本单位,⽐如关键字、标识符、运算 符、常数等。词法分析器会⽣成⼀个词法单元序列。
语法分析
语法分析器会根据语法规则,判断 SQL 语句是否满⾜ MySQL 语法。如果不满⾜,则提示 “You have an error in your SQL syntax”。语法分析器会检查 语法是否符合SQL语⾔的规定,同时构建语法树。
优化器
优化器负责分析查询语句并选择执⾏计划,以最优的⽅式检索或操作数据。优化器的⽬标是选择执⾏计划,使得查 询的执⾏效率最⾼,从⽽提⾼系统性能。
以下是MySQL优化器的⼀些关键⽅⾯:
1. 查询解析:优化器⾸先对查询语句进⾏解析,识别语法和语义,⽣成⼀个内部表示形式,称为查询树 (Query Tree)或查询块(Query Block)。
2. 查询优化:⼀旦⽣成了查询树,优化器开始考虑不同的执⾏计划。它尝试选择最优的执⾏计划,以最⼩化查 询的执⾏成本。这涉及到考虑多个因素,如索引的使⽤、连接顺序、过滤条件的顺序等。
3. 成本估算:优化器使⽤成本模型来估算每个可能执⾏计划的成本。这通常涉及考虑磁盘I/O、CPU消耗等因 素,以便评估执⾏计划的相对效率。
4. 索引优化:优化器会尝试使⽤最适合的索引,以加速数据的检索。这可能涉及选择合适的单列索引或复合索 引,并且可能涉及使⽤覆盖索引等优化技术。
5. 统计信息:优化器使⽤数据库收集的统计信息,如表的⾏数、索引的基数等,来做出更准确的成本估算和执 ⾏计划选择。
6. 动态优化:MySQL的优化器是⼀个动态优化器,意味着它可以在运⾏时根据实际情况进⾏⼀些调整。例如, 可以根据表的⼤⼩和数据分布动态选择是否使⽤索引。
生成一个执行计划需要做一些事情:
选择最合适的索引;
选择表扫还是走索引;
选择表关联顺序;
优化 where 子句;
排除管理中无用表;
决定 order by 和 group by 是否走索引;
尝试使用 inner join 替换 outer join;
简化子查询,决定结果缓存;
合并视图;
执行器
以下是MySQL执⾏器的主要作⽤和⼀些相关的概念:
1. 执⾏计划的执⾏:优化器⽣成执⾏计划后,执⾏器负责按照计划执⾏具体的数据库操作,例如表扫描、索引 扫描、连接操作等。
2. 结果集的处理:当查询语句是⼀个SELECT语句时,执⾏器将负责将查询结果集返回给⽤户。它会逐步地从存 储引擎获取数据,并在需要时将数据发送给客户端。
3. 锁管理:执⾏器在执⾏查询时,需要考虑并发访问的情况,因此它会管理和释放锁以确保数据的⼀致性和隔 离性。这包括共享锁、排他锁、⾏级锁等。
4. 事务管理:如果查询涉及事务,执⾏器负责事务的开始、提交或回滚。它确保事务的原⼦性、⼀致性、隔离 性和持久性(ACID属性)。
5. 异常处理:执⾏器负责处理可能的异常情况,如数据不存在、违反唯⼀性约束、死锁等。在出现异常时,执 ⾏器可能回滚事务或执⾏相应的错误处理逻辑。
6. 返回结果:当查询执⾏完成后,执⾏器将结果返回给客户端。结果可以是查询结果集、受影响的⾏数或其他 执⾏信息。
7. 资源管理:执⾏器需要管理系统资源,例如内存和CPU。这确保在执⾏查询时不会导致系统资源耗尽。
MySQL内部结构
文件结构
内存结构
共享内存
1.innodb_buffer_pool
Innodb 引擎最重要的缓存区域,性能决定性参数之一。包含数据页、索引页、undo 页、i nsert buffer、自适应哈希索引、锁信息以及数据字典等信息。
2.innodb_log_buffer
存放redo log
3.key_buffer
MyISAM 表的重要缓存区域,索引缓存再此
4.query_cache
查询缓存
Session私有内存:每个线程连接独有
'read_buffer_size','read_rnd_buffer_size','sort_buffer_size','join_buffer_size','binlog_cache_size','tmp_ table_size'