使用Mysql也有几年了,今天一起把mysql拆解一下,希望对你有帮助
|
目录
一、数据库连接池管理连接
二、SQL连接器
三、查询缓存
四、分析器
五、优化器
六、执行器
七、存储引擎
八、文件日志
总流程图
一、数据库连接池管理连接
- 在系统和 MySQL 进行交互之前,MySQL 驱动会帮我们建立好连接
- 一次 SQL 请求就会建立一个连接,多个请求就会建立多个连接
- java 系统在通过 MySQL 驱动和 MySQL 数据库连接的时候是基于 TCP/IP 协议的,所以如果每个请求都是新建连接和销毁连接,这样性能一定会下降
- 使用数据库连接池去维护一定的连接数,方便系统获取连接,使用就去池子中获取,用完放回去就可以了
- MySQL 的架构体系中也已经提供了这样的一个池子,也是数据库连池。双方都是通过数据库连接池来管理各个连接的
- 采用的数据库连接池有:Druid、C3P0、DBCP
二、SQL连接器
-
尝试连接数据库后,最先与你打交道的是连接器
-
负责与客户端的连接、获取权限、维护和管理连接
mysql -h$ip -P$port -u$user -p
-
一个用户连接成功后,如果管理员修改了此账号,也不会影响已经存在的连接。只有新建的连接才使用新的设置。
-
连接完成后,如果没有后续操作,连接会成为空闲状态,show processlist命令可以看见它。时间是由wait_timeout控制的,默认是8小时。
-
长连接是指连接成功后,如果客户端有响应,会使用同一个连接。短连接是指每次执行几次就会断开,重新连接。由于连接的建立非常复杂,所以尽量使用长连接。
- 长连接长时间连接会耗费大量内存。使用一段时间后,可以断开一会。mysql5.7后提供了mysql_reset_connection来初始化连接资源(不需要重连和验证身份,但会恢复到刚刚创建的状态)
三、查询缓存
- 如果是以读为主的库,可以方便使用。否则建议将query_cache_type设置为demand,不使用它。mysql 8 将这个查询缓存功能移除了。
四、分析器
- 分析器将sql关键词识别出来,想知道你要干什么。
- 分析出来后,开始语法分析,判断这个sql是否满足sql语法。
- 如果语句写错了,少写了东西,mysql会报出来。一般会提升第一个出现错误的位置。
五、优化器
- 选择合适的索引、多表join时决定各个表的连接顺序都由优化器优化
- MySQL 会帮我去使用他自己认为的最好的方式去优化这条 SQL 语句。使得IO 成本和 CPU 成本最低
- IO 成本:磁盘把数据加载到内存的成本
- CPU 成本:对数据的排序等操作的计算成本
六、执行器
- 前面那些组件的操作最终必须通过执行器去调用存储引擎接口才能被执行
- 执行器会根据之前的一系列的执行计划去调用存储引擎的接口去完成SQL的执行
- 最开始时,先判断你是否有该表的操作权限,否则返回错误(命中查询缓存时,会在返回结果时,进行权限验证)
七、存储引擎
- 执行器将命令发送给存储引擎去执行
- 每次执行sql时,会将磁盘中的数据加载到内存中,以提高速度。这个内存就是存储引擎的缓冲池 Buffer Poool
八、文件日志
- undo.log:没有发生的。修改数据时,会加载到缓冲池和undo日志中,便于数据回滚
- redo.log:redo日志是InnoDB特有的。记录数据被修改后的样子
- bin.log:记录整个操作过程的。这3个日志可以确保数据库发生意外后的数据恢复。