Mysql架构初识
🥲 🥸 🤌 🫀 🫁 🥷 🐻❄️🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 🫑 🫓 🫔 🫕 🦤 🪶 🦭 🪲 🪳 🪰 🪱 🐻❄️ 🫐 🫒 🫑 🫓 🫔 🫕
♔博主昵称:�欢快↑㎡
🕍博客主页:�欢快↑㎡的博客_CSDN博客-学习注意点杂记,BUG集,安装教程领域博主
⚇很方便的在线编辑器:Lightly
🥗感谢点赞🤞🏻评论🤞🏻收藏
相信吧!🤜🏻我们很优秀,还可以更加优秀,加油!🌼让我们一起在写作中记录巩固学习吧!
目录
java和mysql整体概览
MySql驱动
数据库连接池
java系统连接池
mysql数据库的连接池
网络线程连接谁来负责连接
sql接口
查询解析器
查询优化器
执行器
更新怎么执行
InnoDB缓存池
undo日志
redo日志
事务未提交
binlog
binlog刷盘策略
常见刷盘策略
完成事务提交
刷新脏数据
java和mysql整体概览
java的系统连接Mysql的系统
只知道大概在遇到问题不能更好的解决问题。比如死锁,sql性能,异常报错等问题。所以需要我们了解逻辑,才能更好,更快的解决问题。
MySql驱动
我们需要在依赖中增加一个mysql驱动,才能与mysql建立连接。
使用Maven管理项目依赖,可以在pom.xml文件中添加以下依赖:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version>
</dependency>
然后,在Java代码中,需要使用JDBC API与MySQL数据库建立连接。以下是一个示例代码片段:
import java.sql.*;public class MysqlConnect {public static void main(String[] args) {Connection conn = null; //Connection 类可以管理和控制连接try {String dburl = "jdbc:mysql://localhost:3306/mydatabase"; //连接地址String user = "myusername"; //用户名String password = "mypassword"; //密码// 建立连接conn = DriverManager.getConnection(dburl, user, password);System.out.println("连接成功");} catch (SQLException e) {System.out.println("连接失败:" + e.getMessage());} finally {if (conn != null) {try {conn.close(); //关闭连接} catch (SQLException e) {System.out.println("关闭连接失败:" + e.getMessage());}}}}
}
数据库连接池
java系统建立连接是建立多个连接的,建立的连接如果频繁的销毁或创建会造成性能低下,所以是采用复用连接的(web应用是部署在tomcat里面的,springboot项目相当于内嵌了tomcat)
java系统连接池
数据库里面的连接时复用的
mysql数据库的连接池
mysql数据库中的连接也是多线程的,并且也是复用的
网络线程连接谁来负责连接
是靠线程来负责连接的,可以监听连接,读取连接中的sql
sql接口
线程调用sql接口,并将获取到的sql语句给接口
查询解析器
就会解析,让mysql看得懂,比如要从某表做查询动作,条件是什么
查询优化器
选择一个最有查询路径,比如有两条路径(假设)
路径1:定位到user表id=10,查name,age
路径2:把userr name age 都查询出来,看哪条数据id=10
从路径1和路径2中选出一条最优路径
执行器
调用存储引擎,根据优化器生成得执行计划调用存储引擎的接口
mysql中sql接口,sql解析器,查询优化器是同用得
存储引擎有:InnoDB,MyISAM,Memory
更新怎么执行
例子:update user set name = 'aaa' where id = 10;
InnoDB缓存池
它有一个叫Buffeer-pool的缓存池,其中缓存着很多数据,查询的时候,如果缓存池里面有,则不查询磁盘。放在缓存里面可以加快它的访问速度。
如果缓存池里面没有,则从磁盘加载数据到缓存池,对这条数据加独占锁(更新的时候别人不能同时更新)------排他锁------对应共享锁
锁:mysql行锁,表锁,cap锁
undo日志
非自动提交(可以蛇者自动提交)有两个动作:Commit(提交),Rollback(回滚)
InnDB怎么保证可以回滚?
-
update a
-
update b
假设执行update a 时发生异常,需要将 update a 回滚
假设更新语句是:update user set name = 'aaa' where id = 10,原来的数据是bbb
先把原来的数据(bbb)写到undo日志。此时磁盘中的数据是aaa,磁盘与缓存中的数据不一致,也就是脏数据。
更新过程:1.检查Buffer Pool里面有没有这条数据,(没有则从磁盘把数据加载到缓存再更新)
2.有则对该条数据加锁,并且将旧值写到undo日志文件
3.将数据刷到磁盘
redo日志
把新值aaa写入Redo Log buffer内存的一个缓存区,用来存redo日志
事务未提交
Mysql宕机,内存(缓存)的数据就会丢失,写到Redo Log buffer内存的一个缓存数据会丢失
redo日志刷盘策略
将内存数据刷到磁盘,刷盘策略是尽可能的保证数据的安全性和性能。
是通过 DBA(数据库管理员) 来调整 innodb_flush_log_at_try_commit 这个参数的。
DBA功能:
-
数据库参数设置:DBA 可以根据数据库的实际情况,调整数据库参数,以获得更好的性能。例如,可以调整缓存大小、线程池大小等参数。
-
数据库监控:DBA 可以使用各种工具对数据库进行监控,以及时发现并解决问题。例如,可以监控数据库性能、空间使用情况、锁定情况等。
-
数据库备份和恢复:DBA 可以设置数据库的备份策略,并保证备份数据的完整性和可用性。在需要时,DBA 还可以从备份中恢复数据。
-
安全管理:DBA 可以设置数据库的访问权限、加密等安全措施,以确保数据库系统的安全性。
-
性能优化:DBA 可以根据数据库的运行状况,通过重构表结构、索引优化、查询优化等方式,来提高数据库的性能和响应速度。
innodb_flush_log_at_try_commit 这个参数可以设置为 0、1 和 2。
-
当设置为 0 时,日志缓冲区将被写入日志文件,但不会在事务提交时进行日志文件同步。
-
当设置为 1 时,日志缓冲区将被写入日志文件,并在事务提交时进行日志文件同步。
-
当设置为 2 时,无论是否已提交事务,日志缓冲区每秒都只会被写入一次日志文件。
默认为1,可以设置为2,减少磁盘I/O.
binlog
redo日志是重做,是InnoDB特有的------存储引擎特有
binlog是归档日志,是MySQL中的二进制日志,可以用于记录数据库的所有更改 是mysql server的
binlog刷盘策略
sync_binlog参数:这个参数控制着Binlog是否需要同步写入磁盘。当该参数设置为1时,每次写入Binlog都需要等待写入完成后才能返回成功,这样可以保证写入的数据不会丢失。但是,这也会影响系统的性能,因为同步写入磁盘会增加IO负载。
常见刷盘策略
-
innodb_flush_log_at_trx_commit参数:这个参数控制着InnoDB引擎写入Redo Log的时机。当该参数设置为1时,每次事务提交后就会将Redo Log写入磁盘,这可以保证数据的持久化。当该参数设置为0时,Redo Log只会被写入缓存,这样可以提高系统性能,但是如果系统崩溃,未写入磁盘的数据将会丢失。
-
binlog_cache_size参数:这个参数控制着Binlog缓存的大小。当Binlog写满一定大小后,就会进行刷盘操作。如果该参数设置得太小,容易导致频繁的刷盘操作,降低系统性能;如果设置得太大,则可能会浪费过多内存资源。
-
max_binlog_size参数:这个参数限制了单个Binlog文件的最大大小。一旦文件达到该大小,就会自动切换到下一个文件。如果该参数设置得太小,则会频繁地切换文件,增加系统开销;如果设置得太大,则可能会造成单个文件过大,难以管理。
完成事务提交
写入磁盘文件后,最后完成提交。
将缓存数据写入磁盘,并释放锁定的资源
同时记录binlog文件名称和这次binlog在文件的位置,写入redolog并写入commit标记
刷新脏数据
会有线程再去刷新数据