赞
踩
客户端: 由各种语言编写的程序,负责与Mysql服务端进行网络连接。
服务端: 包括以下几层
一条sql语句的执行就是从上往下经过这4层。
jdbc
odbc
等show variables like '%max_connections%';
查询目前Mysql的最大连接数。SQL接口组件
解析器
优化器
缓存和缓冲区
select
的数据缓存。MySQL会对于一些经常执行的查询SQL语句,将其结果保存在缓存中。MySQL 8.X
中,移除了缓存区,毕竟命中率不高。同时一般程序都会使用Redis
做一次缓存。Checkpoint
的机制,将内存中更新的数据刷写到磁盘。innodb_buffer_pool
,而MyISAM则叫做key_buffer
。日志板块
①binlog二进制日志,主要记录MySQL数据库的所有写操作(增删改)。
②redo-log重做/重写日志,MySQL崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘(InnoDB专有的)。
③undo-logs撤销/回滚日志,记录事务开始前[修改数据]的备份,用于回滚事务。
④error-log:错误日志:记录MySQL启动、运行、停止时的错误信息。
⑤general-log常规日志,主要记录MySQL收到的每一个查询或SQL命令。
⑥slow-log:慢查询日志,主要记录执行时间较长的SQL。
⑦relay-log:中继日志,主要用于主从复制做数据拷贝。
数据板块
db.opt文件:主要记录当前数据库使用的字符集和验证规则等信息。
.frm文件:存储表结构的元数据信息文件,每张表都会有一个这样的文件。
.MYD文件:用于存储表中所有数据的文件(MyISAM引擎独有的)。
.MYI文件:用于存储表中索引信息的文件(MyISAM引擎独有的)。
.ibd文件:用于存储表数据和索引信息的文件(InnoDB引擎独有的)。
.ibdata文件:用于存储共享表空间的数据和索引的文件(InnoDB引擎独有)。
.ibdata1文件:这个主要是用于存储MySQL系统(自带)表数据及结构的文件。
.ib_logfile0/.ib_logfile1文件:用于故障数据恢复时的日志文件。
.cnf/.ini文件:MySQL的配置文件,Windows下是.ini,其他系统大多为.cnf。
客户端要将SQL语句发给服务端之前,要先根据配置文件中的url
、username
、password
与服务端进行网络连接。
由于涉及到了网络请求,那此时必然会先经历TCP三次握手的过程,同时获取到连接对象完成SQL操作后,又要释放这个数据库连接,此时又需要经历TCP四次挥手过程。
因此每次操作数据库时,客户端都需要获取新的连接对象,这是非常耗时耗资源的操作。
「数据库连接池」和「线程池」的思想相同,会将数据库连接这种较为珍贵的资源,利用池化技术对这种资源进行维护。也就代表着之后需要进行数据库操作时,不需要自己去建立连接了,而是直接从「数据库连接池」中获取,用完之后再归还给连接池,以此达到复用的效果。
MySQL连接池维护的是工作线程,客户端连接池则维护的是网络连接。
注意: Mysql 8.X 版本
已经移除了查询缓存
①先将SQL发送给SQL接口,SQL接口会对SQL语句进行哈希处理。
②SQL接口在缓存中根据哈希值检索数据,如果缓存中有则直接返回数据。
③缓存中未命中时会将SQL交给解析器,解析器会判断SQL语句是否正确:
④优化器根据SQL制定出不同的执行方案,并择选出最优的执行计划。
⑤工作线程根据执行计划,调用存储引擎所提供的API获取数据。
⑥存储引擎根据API调用方的操作,去磁盘中检索数据(索引、表数据…)。
⑦发生磁盘IO后,对于磁盘中符合要求的数据逐条返回给SQL接口。
⑧SQL接口会对所有的结果集进行处理(剔除列、合并数据…)并返回。
undo-log
日志和redo-log
(prepare状态)日志。Checkpoint
机制刷写到磁盘。bin-log
日志,同时将redo-log
日志中的记录改为commit
状态。undo-log日志
undo-log日志
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。