Mysql数据库进阶

一、Mysql组织架构

连接层

1.验证用户的身份,用户名密码是否匹配
2.提供两种连接方式(TCP/IP连接、socket连接)
3.连接层提供了一个与sql层交互的线程

SQL层

1.接收连接层传过来的SQL语句
2.验证执行的SQL语法
3.验证SQL的语义(DDL,DML,DQL,DCL)
4.解析器:解析SQL语句,生成执行计划
5.优化器:将解析器传来的执行计划选择最优的一条执行
6.执行器:将最优的一条执行
    6.1 与存储引擎层建立交互的线程
    6.2 将要执行的sql发给存储引擎层
7.如果有缓存,则走缓存
8.记录日志(如binlog)

存储引擎层

1.接收SQL层传来的语句
2.与磁盘交互,获取数据,返回给sql层
3.建立与sql层交互的线程

mysql数据库服务端-----》innodb存储引擎
操作系统------------》文件系统
计算机硬件----------》硬盘

二、存储引擎

定义

存储引擎------说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法,专门处理其对应的类型的表。

存储引擎决定了表的类型

            存储引擎---------表
            视频播放---------mp4
            文本编辑器-------txt 

#InnoDB 存储引擎  ----默认在内存中已经建立了自适应的hash索引
#MyISAM 存储引擎
只是读取和插入,不支持事务、表级锁设计、支持全文索引,不支持故障自动恢复,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。   (.frm表结构      .MYD表数据     .MYI表索引)
#Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引
#Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。
#BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库

innodb存储引擎概述默认

----------------三大特性

事务              
行级锁:innodb支持行级锁,myisam是表级锁,锁的粒度越小并发能力越强(一次只运行一个,保障安全性)
支持外键

MVCC        多版本并发控制
备份和恢复   innodb支持支持热备,myisam不支持
自动故障恢复 (CSR) Crash Safe Recovery

[root@egon db1]# cd /var/lib/mysql/db1/
[root@egon db1]# ls
db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

###      .frm表的元数据文件(表结构)     .ibd表的数据文件+索引文件

查看

MariaDB [(none)]> show engines\G  #查看所有支持的存储引擎
MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使用的存储引擎#查看使用innodb的表有哪些
# table_schema字段的值即表所在的库
select table_schema,table_name,engine from information_schema.tables where engine='innodb';

#mysql5.6以后默认使用innodb存储引擎

使用

1、建表时,使用不同的存储引擎

    create table t1(id int)engine=blackhole;
    create table t2(id int)engine=memory;
    create table t3(id int)engine=myisam;
    create table t4(id int)engine=innodb;

2、修改配置文件指定默认的存储引擎

/etc/my.cnf
[mysqld]
default-storage-engine=INNODB   #指定
innodb_file_per_table=1    # 让每个表都有自己独立的的ibd文件,如果不指定的话,所有表                                              的数据文件都会集中在/var/lib/mysql/ibdata1这个共享数据文件中

案例:升级存储引擎

  • 准备工作----一台新机器
源码包安装,二进制安装# 配置yum源
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=1
gpgcheck=0# 获取mysql5.7初始密码
grep "temporary password" /var/log/mysqld.log# 设置密码,密码已经不能再用弱密码了,弱密码会报错
set password=password("Egon@123");
  • 在旧机器上备份生产库数据
# –triggers (默认导出触发器,使用–skip-triggers屏蔽导出)
# -R:–routines,导出存储过程以及自定义函数mysqldump -uroot -p123 -B db1 --triggers -R  > /tmp/db1.sql
  • 处理备份数据(更改默认存储引擎)
[root@db01 ~]# sed -i 's#ENGINE=MYISAM#ENGINE=INNODB#gi' /tmp/db1.sql
  • 将备份的数据传到新的数据库服务器上并将修改后的备份恢复到新库
scp  rsync 硬件设备  NFS
mysql -uroot -p123 < /tmp/db1.sql
  • 应用测试环境连接新库,测试所有功能
  • 停止应用,将备份之后的生产库发生的新变化补偿到新库
  • 应用切割到新数据库

Innodb逻辑架构

mysql数据库服务端---》innodb存储引擎--》用户态内存空间(应用程序的内存空间)
操作系统------------》文件系统--------》os cache(操作系统缓存)
计算机硬件----------》硬盘------------》硬盘结构(硬盘中的数据)

             

内存架构

innodb内存
  1. 缓冲池(优化读)
  2. 写缓冲(优化写)
  3. 日志缓冲
  4. 自适应哈希索引

操作系统缓存

为了提升性能而降低磁盘IO的次数(攒一波再写入),在InnoDB的缓存体系与磁盘文件之间,加了一层操作系统的缓存/页面缓存。用户态innodb存储引擎的进程向操作系统发起write系统调用时,在内核态完成页面缓存写入后即返回,如果想立即将页面缓存的内容立即刷入磁盘,innodb存储引擎需要发起fsync系统调用才可以。

两个系统调用(按一定频率配合使用):

  • write:将数据写入操作系统的页面缓存后立即返回(存在丢失数据的风险)
  • fsync:将数据立即提交到硬盘中,强制硬盘同步(大量进行会出现性能瓶颈)

O_DIRECT

选项是在Linux系统中的选项,使用该选项后,对文件进行直接IO操作,不经过文件系统缓存,直接写入磁盘

硬盘上的架构
  1. 表  文件----一堆二进制乱码
  2. 表空间   ibd文件
  3. 索引
  4. 双写缓冲:位于表空间,记录innodb缓存改动之前的数据
  5. redo日志:记录尚未完成的操作,断电则用其重做(崩溃恢复)
  6. undo日志:记录改动之前的旧数据,一旦改错可以回滚


###      默认情况下,创建InnoDB表的时候innodb_file_per_table参数是开启的,它表明用户创建的表和索引,会被以单表单文件的形式放入到file-per-table表空间中。如果禁用了该参数innodb_file_per_table,那么表及索引会被放入系统表空间(共享表空间)中
 


Innodb存储引擎执行流程

执行一条更新sql语句------三大阶段,8小步骤

  1. 执行阶段
    数据加载到内存,写undo log,更新内存中的数据,写redo log buffer
  2. 事务提交阶段
    redo log 和 binlog 刷盘,commit标记写入redo log 中
  3. 最后
    后台io线程随机把被内存中的脏数据刷到磁盘上

  • 把该行数据从磁盘加载到buffer pool 中,并对该行数据进行加锁
  • 把旧数据写入undo log以便修改出错的情况下进行回滚
  • 在buffer pool 中的数据更新,得到脏数据
  • 将修改后的脏数据写入redo log buffer中
  • 准备提交事务,redo log 刷入磁盘
  • 把修改的操作记录准备写入binlog日志(事务提交时)
  • 把binlog的文件名和位置写入commit标记,commit标记写入redo log 中(redo log 中存放的修改后的数据与binlog中的修改操作对应上,双管齐下),事务的提交才算成功,否则不会成功
  • IO线程buffer pool 中的脏数据刷入磁盘文件,完成最终修改

补充:

  1. redo接受脏数据(改动后的数据)-----先放到缓冲区再放到磁盘
    binlog接受详细改动操作的信息-----直接写入磁盘
  2. 第八步IO操作最耗时间
  3. innodb_flush_log_at_trx_commit参数(redo log刷盘策略)
    1  默认值,事务提交时必须把redo log从内存刷入磁盘(安全性最高,最耗时)
    0  等待innodb主动执行刷新磁盘(风险最高)    
    2  直接把日志放到操作系统缓存,等待操作系统刷新磁盘(mysql挂了机器没挂数据不会丢失) 
  4. sync_binlog参数(binlog刷盘策略)
    0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统思考:短期困境与长期收益

最近在项目中&#xff0c;一直有学员会提到一个议题&#xff0c;如何平衡当前困境和长期收益&#xff1f; 我的思考是在商业和人生的路上&#xff0c;我们常常听到“鱼和熊掌不可兼得”的说法&#xff0c;似乎短期利益和长期目标注定是对立的。但事实上&#xff0c;鱼与熊掌是…

Spring Web MVC快速入门

什么是Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". View(视图) 指在应⽤程序…

DeepSeek基于注意力模型的可控图像生成

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 图像的加噪与模型训练 在扩散模型的训练过程中&#xff0c;首先需要对输入的信号进行加噪处理&#xff0c;经典的加噪过程是在图像进行向量化处理后在其中添加正态分布&#xff0c;而正态分布的值也是与时间…

第十六届蓝桥杯B组第二题

当时在考场的时候这一道题目 无论我是使用JAVA的大数&#xff08;BIGTHGER&#xff09;还是赛后 使用PY 都是没有运行出来 今天也是突发奇想在B站上面搜一搜 看了才知道这也是需要一定的数学思维 通过转换 设X来把运算式精简化 避免运行超时 下面则是代码 public class lanba…

HT71663同步升压2.7V-13V输入10A聚能芯半导体禾润一级代理

在便携式设备飞速发展的今天&#xff0c;电源转换效率与产品尺寸始终是行业难以平衡的难题。但现在&#xff0c;HT71663 高功率全集成升压转换器强势登场&#xff0c;一举打破僵局&#xff0c;为便携式系统带来颠覆性的高效小尺寸解决方案&#xff01;​ HT71663 的卓越性能&am…

Unity:输入系统(Input System)与持续检测键盘按键(Input.GetKey)

目录 Unity 的两套输入系统&#xff1a; &#x1f50d; Input.GetKey 详解 &#x1f3af; 对比&#xff1a;常用的输入检测方法 技术底层原理&#xff08;简化版&#xff09; 示例&#xff1a;角色移动 为什么会被“新输入系统”替代&#xff1f; Unity 的两套输入系统&…

港大今年开源了哪些SLAM算法?

过去的5个月&#xff0c;香港大学 MaRS 实验室陆续开源了四套面向无人机的在线 SLAM 框架&#xff1a;**FAST-LIVO2 、Point-LIO&#xff08;grid-map 分支&#xff09; 、Voxel-SLAM 、Swarm-LIO2 **。这四套框架覆盖了单机三传感器融合、高带宽高速机动、长时间多级地图优化以…

【质量管理】TRIZ因果链分析:解码质量问题的“多米诺效应“

为什么要使用因果链分析 没有发现问题并不等于没有问题。爱因斯坦曾说&#xff0c;如果我只有一个小时的时间来拯救世界&#xff0c;我将花45分钟时间分析问题&#xff0c;10分钟的时间来检查问题&#xff0c;最后5分钟的时间来解决问题。可见问题分析的重要性。 在质量管理实践…

线程中常用的方法

知识点详细说明 Java线程的核心方法集中在Thread类和Object类中,以下是新增整合后的常用方法分类解析: 1. 线程生命周期控制 方法作用注意事项start()启动新线程,JVM调用run()方法多次调用会抛出IllegalThreadStateException(线程状态不可逆)。run()线程的任务逻辑直接调…

c++:迭代器(Iterator)

目录 &#x1f6aa;什么是迭代器&#xff1f; &#x1f527; 迭代器的本质 为什么不用普通数组或下标&#xff1f; STL容器的迭代器并不是共用一个类型&#xff01; 迭代器的类型&#xff08;Iterator Categories&#xff09; &#x1f4e6; 常见容器的迭代器类型 ✅ 迭…

【文件系统—散列结构文件】

文章目录 一、实验目的实验内容设计思路 三、实验代码实现四、总结 一、实验目的 理解linux文件系统的内部技术&#xff0c;掌握linux与文件有关的系统调用命令&#xff0c;并在此基础上建立面向随机检索的散列结构文件&#xff1b;## 二、实验内容与设计思想 实验内容 1.设…

力扣26——删除有序数组中的重复项

目录 1.题目描述&#xff1a; 2.算法分析&#xff1a; 3.代码展示&#xff1a; 1.题目描述&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对…

ggplot2 | GO barplot with gene list

1. 效果图 2. 代码 数据是GO的输出结果&#xff0c;本文使用的是 metascape 输出的excel挑选的若干行。 # 1. 读取数据 datread.csv("E:\\research\\scPolyA-seq2\\GO-APA-Timepoint\\test.csv", sep"\t") head(dat)# 2. 选择所需要的列 dat.usedat[, c(…

学习搭子,秘塔AI搜索

什么是秘塔AI搜索 《秘塔AI搜索》的网址&#xff1a;https://metaso.cn/ 功能&#xff1a;AI搜索和知识学习&#xff0c;其中学习部分是亮点&#xff0c;也是主要推荐理由。对应的入口&#xff1a;https://metaso.cn/study 推荐理由 界面细节做工精良《今天学点啥》板块的知…

【C语言】--指针超详解(三)

目录 一.数组名的理解 二.使用指针访问数组 三.一维数组传参的本质 四.冒泡排序 五.二级指针 六.指针数组 6.1--指针数组的定义 6.2--指针数组模拟二维数组 &#x1f525;个人主页&#xff1a;草莓熊Lotso的个人主页 &#x1f3ac;作者简介&#xff1a;C方向学习者 &…

Linux防火墙

1.防火墙是一种位于内部网络与外部网络之间的网络安全系统&#xff0c;它依照特定的规则&#xff0c;允许或限制传输的数据通过&#xff0c;以保护内部网络的安全。以下从功能、分类、工作原理等方面为你详细讲解&#xff1a; 功能访问控制&#xff1a;这是防火墙最主要的功能。…

嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算

目录 一、结构体&#xff08;struct关键字&#xff09; &#xff08;一&#xff09;声明一个结构体数据类型 &#xff08;二&#xff09;结构体的成员初始化与赋值 a、结构体变量赋值 b、结构体成员初始化 c、结构体的定义形式 &#xff08;三&#xff09;考点&#xff…

Python字典:数据操作的核心容器

在Python编程生态中&#xff0c;字典&#xff08;dict&#xff09;是最常用且功能强大的内置数据结构之一。它以键值对&#xff08;Key-Value Pair&#xff09;的形式存储数据&#xff0c;为快速查找、灵活映射关系提供了天然支持。无论是数据清洗、算法实现还是Web开发&#x…

按位宽提取十六进制值

需求&#xff1a;给出一个十六进制值&#xff0c;要求提取high和low位之间的值。比如16ha0f0&#xff0c;这是一个16bit宽的十六进制数0xa0f0&#xff0c;提取[15:12]范围内的值。 def extract_bits(value, high, low):"""从 value 中提取 [high:low] 位的值:p…

LeRobot 项目部署运行逻辑(六)——visualize_dataset_html.py/visualize_dataset.py

可视化脚本包括了两个方法&#xff1a;远程下载 huggingface 上的数据集和使用本地数据集 脚本主要使用两个&#xff1a; 目前来说&#xff0c;ACT 采集训练用的是统一时间长度的数据集&#xff0c;此外&#xff0c;这两个脚本最大的问题在于不能裁剪&#xff0c;这也是比较好…