当前位置: 首页 > news >正文

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怎么保证可以回滚?

  1. update a

  1. 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功能:

  1. 数据库参数设置:DBA 可以根据数据库的实际情况,调整数据库参数,以获得更好的性能。例如,可以调整缓存大小、线程池大小等参数。

  1. 数据库监控:DBA 可以使用各种工具对数据库进行监控,以及时发现并解决问题。例如,可以监控数据库性能、空间使用情况、锁定情况等。

  1. 数据库备份和恢复:DBA 可以设置数据库的备份策略,并保证备份数据的完整性和可用性。在需要时,DBA 还可以从备份中恢复数据。

  1. 安全管理:DBA 可以设置数据库的访问权限、加密等安全措施,以确保数据库系统的安全性。

  1. 性能优化: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负载。

常见刷盘策略

  1. innodb_flush_log_at_trx_commit参数:这个参数控制着InnoDB引擎写入Redo Log的时机。当该参数设置为1时,每次事务提交后就会将Redo Log写入磁盘,这可以保证数据的持久化。当该参数设置为0时,Redo Log只会被写入缓存,这样可以提高系统性能,但是如果系统崩溃,未写入磁盘的数据将会丢失。

  1. binlog_cache_size参数:这个参数控制着Binlog缓存的大小。当Binlog写满一定大小后,就会进行刷盘操作。如果该参数设置得太小,容易导致频繁的刷盘操作,降低系统性能;如果设置得太大,则可能会浪费过多内存资源。

  1. max_binlog_size参数:这个参数限制了单个Binlog文件的最大大小。一旦文件达到该大小,就会自动切换到下一个文件。如果该参数设置得太小,则会频繁地切换文件,增加系统开销;如果设置得太大,则可能会造成单个文件过大,难以管理。

完成事务提交

写入磁盘文件后,最后完成提交。

将缓存数据写入磁盘,并释放锁定的资源

同时记录binlog文件名称和这次binlog在文件的位置,写入redolog并写入commit标记

刷新脏数据

会有线程再去刷新数据

http://www.lryc.cn/news/40131.html

相关文章:

  • 字符串函数和内存函数
  • Web3中文|GPT-4超越GPT-3.5的五大看点
  • 动态矢量瓦片缓存库方案
  • 628.三个数的最大乘积
  • 【数据结构】堆和集合笔记
  • java LinkedList 源码分析(通俗易懂)
  • Vue中实现路由跳转的三种方式详细分解
  • 全国自学考试03708《中国近现代史纲要》重点复习精要
  • 数据库面试题——锁
  • Python笔记 -- 文件和异常
  • 蓝桥杯刷题冲刺 | 倒计时24天
  • 真正理解微软Windows程序运行机制——什么是消息
  • HTTP 缓存的工作原理
  • RK3568在Android上进行驱动模块开发(源码外)
  • 操作技巧 | 在Revit中借用CAD填充图案的方法
  • Java的二叉树、红黑树、B+树
  • 昨天某读者拿到华为OD岗位offer,今天来分享一下经验,包含华为OD机试
  • 树的遍历方式(前中后,层序遍历,递归,迭代,Morris遍历)-----直接查询代码
  • Docker Registry部署镜像私有仓库及鉴权认证
  • stm32外设-中断详解
  • 第十四届蓝桥杯三月真题刷题训练——第 13 天
  • webgl_gpgpu_birds 样例分析
  • 以业务行为驱动的反入侵安全能力建设
  • Unity3d C#使用DOTween插件的Sequence实现系列动画OnComplete无效和颜色设置无效的问题记录
  • 【蓝桥杯-筑基篇】排序算法
  • 编辑器进化 VSCode + Vim
  • LearnOpenGL-高级OpenGL-6.天空盒
  • Printk打印内核日志
  • 界面控件DevExpress WPF 202计划发布的新功能合集
  • Spring Cloud Alibaba 微服务2,注册中心演变 + Nacos注册中心与配置中心