MySQL 从入门到实践,万字详解!(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库是往全栈发展不得不跨过的一道坎,大家不可避免会学到用到相关知识,最近查资料的时候发现网上很多内容要么就特别深,要么不成体系,对一些希望浅尝辄止仅仅是使用一下的人不太友好。最近刚好有机会学到 MySQL,集中一些时间学习了一下 MySQL 同时做了一些笔记,每个概念基本都有代码示例,每一行都是在下手打,读者可以直接复制了代码到命令行中运行,希望对大家有所帮助~ 😜

微信截图_20220427232634.png

数据库是往全栈发展不得不跨过的一道坎,大家不可避免会学到用到相关知识,最近查资料的时候发现网上很多内容要么就特别深,要么不成体系,对一些希望浅尝辄止仅仅是使用一下的人不太友好。最近刚好有机会学到 MySQL,集中一些时间学习了一下 MySQL 同时做了一些笔记,每个概念基本都有代码示例,每一行都是在下手打,读者可以直接复制了代码到命令行中运行,希望对大家有所帮助~  😜


本文介绍的知识都不是特别深,目标用户是对 MySQL 零基础或弱基础的小伙伴们,可以帮助对 MySQL 建立一些概念,至少碰到相关问题知道怎么去百度,也不会碰到后端给的数据库文件看不懂。


对于 Docker 和 CentOS 相关知识不了解的小伙伴可以看看 <手摸手带你 Docker 从入门到实践><半小时搞会 CentOS 入门必备基础知识> 两篇文章,反正 Docker 和 CentOS 也早晚会用到 😂


所有代码保存在 Github 上,可以自行 Clone 下来阅读和执行。


CentOS 版本: 7.6


MySQL 版本:8.0.21


微信截图_20220427233153.png


上面这个脑图可以加文末公众号回复 「mysql脑图」 获取 xmind 源文件。


1. 什么是数据库


数据库是一个以某种有组织的方式存储的数据集合,可以将其想象为一个文件柜。


1.1 基本信息


MySQL 数据库隶属于MySQL AB公司,总部位于瑞典,后被 oracle 收购。是目前最流行的关系型数据库。


优点:


  1. 成本低:开放源代码,一般可以免费试用;
  2. 性能高:执行很快;
  3. 简单:很容易安装和使用。


1.2 MySQL 安装


MySQL 建议使用 Docker 安装,几行命令就安装好了,参见 <手摸手带你 Docker 从入门到实践> - 安装 MySQL


我这里的命令是:


# 创建mysql容器
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=888888 \
-v /Users/sherlocked93/Personal/configs/mysql.d:/etc/mysql/conf.d \
-v /Users/sherlocked93/Personal/configs/data:/var/lib/mysql \
--name localhost-mysql mysql
# 创建好之后进入 mysql 容器:
docker exec -it localhost-mysql bash
# 登录 mysql
mysql -u root -p888888
复制代码


如果你机子上安装了 navicate,可以参考一下下面这个配置


微信截图_20220427233202.png


选择 New Connection 之后填一下配置:


微信截图_20220427233209.png


就可以看到你数据库里面的内容了。


就可以啦,效果如下图:


微信截图_20220427233213.png


不用 Docker 可以去官网 MySQL Community Server 下载对应版本的 MySQL 安装包,Community Server 社区版本是不要钱的,下载安装完毕也可以,基本一直下一步就行了。


废话少说,下面直接开始知识灌体!


2. MySQL  简单使用


2.1 数据库相关术语


数据库相关的概念和术语:


  1. 数据库(database) 保存有组织的数据的容器;
  2. (table) 某种特定类型数据的结构化清单;
  3. 模式(schema) 关于数据库和表的布局及特性的信息;
  4. (column) 表中的一个字段,所有表都是由一个或多个列组成的;
  5. 数据类型(datatype) 所容许的数据的类型;
  6. (row) 表中的一个记录;
  7. 主键(primary key) 一列(或一组列),其值能够唯一区分表中每个行;
  8. 外键(foreign key) 表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
  9. 子句(clause) SQL 语句由子句构成,有些子句是必需的,而有的是可选的。比如 select 语句的 from 子句。


2.2 主键


主键的概念十分重要,它唯一标识表中每行的单个或者多个列称为主键。主键用来表示一个特定的行。


虽然并不总是都需要主键,但应尽量保证每个表都定义有主键,以便于以后的数据操纵和管理。没有主键,无法将不同的行区分开来,更新或删除表中特定行很困难。


表中的任何列都可以作为主键,只要它满足以下条件:


  1. 任意两行都不具有相同的主键值;
  2. 每个行都必须具有一个主键值(主键列不允许 NULL 值)。


在使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(单个列的值可以不唯一)。


几个普遍认可的最好习惯为:


  1. 不更新主键列中的值;
  2. 不重用主键列的值;
  3. 不在主键列中使用可能会更改的值。


2.3 语法规范


语法规范:


  1. 输入 help\h 获取帮助;
  2. 不区分大小写,但建议关键字大写,表名、列名小写;
  3. 每条命令最好使用分号 ;\g 结尾,仅按 Enter 不执行命令;
  4. 每条命令根据需要,可以进行缩进、换行;
  5. # 开头进行多行注释,用 /* ... */ 进行多行注释;
  6. 输入 quitexit 推出 MySQL 命令行;


语法特点:


  1. 大小写不敏感;
  2. 可以写在一行或多行,可以分成多行以便于阅读和调试;
  3. 关键字不能被缩写也不能分行;
  4. 各子句一般分行写;
  5. 推介使用缩进提高语句的可读性;


常见的简单命令:


mysql -u root -p      # –h 主机名 –u 用户名 -P 端口号 –p密码,注意-p跟密码之间不能加空格其他可以加可以不加
select version();     # 查看 mysql 服务版本
show databases;       # 查看所有数据库,注意最后有 s
create database [库名]; # 创建库
use [库名];             # 打开指定的库
show tables;           # 查看当前库的所有表        
show tables from [库名];   # 查看其他库的所有表               
desc [表名];               # 查看表结构   
create table [表名] (      # 创建表            
  列名 列类型,
  列名 列类型,
);
drop database [库名];     # 删除库  
drop table [表名];        # 删除表   
exit;                    # 退出
复制代码


2.4 创建表并填充数据


首先我们整点数据,方便后面的代码演示。


mysql -u root -p888888     # 输入用户名密码,进入mysql命令行
复制代码


然后在 Github 下载文件 create.sql 并运行(也可以直接复制文件里的内容到 MySQL 命令行中执行)。


如果你用的是 navicate,在上一章创建到 localhost-mysql 的连接后,运行一下即可:


微信截图_20220427233220.png


同理运行另一个文件 populate.sql,填充每个表中的数据。


运行之后在命令行中 show tables 就可以看到库中的表了,如下图:


微信截图_20220427233224.png


2.5 关系表


简单介绍一下刚刚创建好的表。


为了数据分类处理,顾客 customers、供应商 vendors、订单 orders、订单信息 orderitems、产品记录 productnotes、产品 products 表分别存储不同的信息。


比如供应商信息表 vendors 总每个供应商都有一个唯一标识,也就是主键 vend_id,而 products 产品表的每个产品也有一个主键 prod_id,还有一个字段 vend_id 供应商 ID 和供应商表中的 vend_id 一一对应,这就是外键


如果你希望通过产品 ID 查到对应的供应商信息,那么就通过外键来找到另一个表中的信息。外键避免了每个产品都重复保存供应商的详细信息,只要保存供应商的 ID 就行,当供应商信息变了,比如邮箱、地址变更,也不用挨个改每一行的数据,只需更改供应商表中对应供应商信息。


这样做的好处:


  1. 供应商信息不重复,从而不浪费时间和空间;
  2. 如果供应商信息变动,可以只更新 vendors 表中的单个记录,相关表中的数据不用改动;
  3. 由于数据无重复,显然数据是一致的,这使得处理数据更简单。


可伸缩性(scale),能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好(scale well)。


2.6 数据类型


MySQL 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。


数值型


整型:TinyintSmallintMediumintIntInteger)、Bigint,可以为无符号和有符号,默认有符号。


  1. 如果不设置有无符号默认是有符号,如果想设置无符号,可以添加 unsigned 关键字;
  2. 如果插入的数值超出了整型的范围,会报 out of range 异常,并且插入临界值;
  3. 如果不设置长度,会有默认的长度。


小数


  1. 定点数:dec(M,D)decimal(M,D)
  2. 浮点数:float(M, D)double(M, D)


M 为整数部位+小数部位,D 为小数部位,M 和 D 都可以省略。如果是 decimal,则 M 默认为 10,D 默认为 0。


字符型


  1. 较短的文本:char(n)varchar(n) 中的 n 代表字符的个数,不代表字节个数。
  2. 较长的文本:text(长文本数据)、blob(较长的二进制数据)。
  3. binaryvarbinary 用于保存较短的二进制。
  4. enum 用于保存枚举。
  5. set 用于保存集合。


日期和时间类型


  1. date 格式 YYYY-MM-DD,保存日期;
  2. time 格式 HH:MM:SS,保存时间;
  3. year 格式 YYYY,保存年;
  4. datetime 格式 YYYY-MM-DD HH:MM:SS,保存日期+时间,范围 1000-9999,不受时区印象;
  5. timestamp 时间戳,格式保存日期+时间,范围 1970-2038,受时区影响;


3. 检索数据 select


用来查询的 select 语句大概是最常用的了,用来从一个或多个表中检索信息,一条 select 语句必须至少给出两条信息:想选择什么、从什么地方选择。


# 基本语法
select [查询列表] from [表名];
# 查询单个/多个/所有字段
select cust_name from customers;
select cust_name,cust_city,cust_address from customers;
select `select` from customers;               # 如果某字段是关键字,可以用 ` 符号包起来
select * from customers;                      # * 表示所有                
# 查询常量值/表达式/函数
select 100;
select 'zhangsan';
select 100%98;
select version();
复制代码


微信截图_20220427233231.png


3.1 去重 distinct


查询出来的结果可能有多个重复值,可以使用 distinct 关键字来去重


select order_num from orderitems;           # 有一些重复值
select distinct order_num from orderitems;  # 将重复值去重
复制代码


3.2 限制结果 limit


select 语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用 limit 子句。


limit m 表示返回找出的前 m 行,limit m,n 表示返回第 m 行开始的 n 行,也可以使用 limit m offset n 含义和前面一样。


注意,检索出来的第一行的索引为 0 行。


微信截图_20220427233235.png


3.3 完全限定表名与列名


在某些情况下,语句可能使用完全限定的列明与表名:


select orderitems.order_num from mysql_demo1.orderitems;
# 上面这句等价于
select order_num from orderitems;
复制代码


4. 排序检索数据 order by


上一章从 orderitems 这个表中检索的数据是没有排序的,一般情况下返回的顺序是在底层表中出现的顺序。可以通过 order by 子句来对检索后的数据进行排序。


可以用 ascdesc 关键字来指定排序方向。order by asc 升序、order by desc 降序,不写默认是升序。


order by 子句中可以支持单个字段、多个字段、表达式、函数、别名,一般放在句子的最后面,除了 limit 之外。


select * from orderitems order by item_price;           # 按item_price升序排列
# 先按 quantity 升序排列,quantity 的值一样时按 item_price 的值升序排列
select * from orderitems order by quantity,item_price;  
# 先按 quantity 降序排列,quantity 的值一样时按 item_price 的值升序排列
select * from orderitems order by quantity desc,item_price;  
# 找到最贵订单
select * from orderitems order by item_price desc limit 1;
复制代码


5. 过滤数据 where


from 子句后使用 where 关键字可以增加筛选条件,过滤数据。


# 基本语法
select [查询列表] from [表名] where [筛选条件] order by [排序条件];
复制代码


按条件表达式来筛选 >=<>=<=!=<><=>


# 找出产品价格为 2.5 的产品名字
select prod_name, prod_price from products where prod_price=2.5;
# 找出产品价格小于等于 10 的产品名字,并按产品价格降序排列
select prod_name, prod_price from products where prod_price <= 10 order by prod_price desc;
# 找到供应商 id 不为 1003 的产品,!= 和 <> 含义一样,都是不等于
select vend_id, prod_name from products where vend_id <> 1003;
复制代码


5.1 范围检查 between and


使用 between ... and ... 指定所需范围的开始值和结束值,可以达到范围查询的效果。


注意 between and 左右数字是按小大的顺序的,调过来不行。


# 查询产品价格在 3 到 10 内的产品
select prod_name, prod_price from products where prod_price between 3 and 10;
# 单独使用 and 也可以打到这个效果
select prod_name, prod_price from products where prod_price <= 10 and prod_price >= 3;
复制代码


5.2 空值检查 is (not) null


创建表时,可以指定某些列可以不包含值,即可以为 nullnull 表示无值 no value,这与字段包含 0、空字符串或仅仅包含空格不同。


使用 is nullis not null 可以用来判断一个值是否为 null


说明:


  1. 等于 = 和不等于 <>!= 不能用来判断 null,只能用 is nullis not null 来判断 null
  2. <=> 安全等于号可以用来判断 null


# 找出顾客中邮箱不是 null 的顾客信息
select * from customers where cust_email is not null;
# 使用安全等于号来判断 null 也是可以的
select * from customers where cust_email <=> null;
复制代码


5.3 逻辑与操作符 and


操作符(operator) 用来联结或改变 where 子句中的子句的关键字,也称为逻辑操作符(logical operator)。


前文提到了 and 操作符,通过这个操作符可以增加限定条件:


# 找出供应商为 1003 提供的价格小于等于 10 的产品
select * from products where vend_id = 1003 and prod_price <= 10;
复制代码


5.4 逻辑或操作符 or


or 操作符和 and 操作符相反,这是逻辑或操作符,返回匹配任一条件的行:


# 找出id为 1003 或 1001 的供应商
select * from products where vend_id = 1003 or vend_id = 1001;
复制代码


andor 同时出现时,会优先处理 and,比如这句:


select * from products where vend_id = 1001 or vend_id = 1003 and prod_price >= 10;
复制代码


这句会先处理 and,表示 vend_id 为 1003 且 prod_price 大于等于 10 的产品,或者 vend_id 为 1001 的产品。


遇到这种情况,可以通过增加圆括号:


select * from products where (vend_id = 1001 or vend_id = 1003) and prod_price >= 10;
复制代码


这样检索的结果就是 vend_id 为 1001 或 1003 的产品里,所有 prod_price 大于等于 10 的产品列表了。


任何时候使用具有 andor 操作符的 where 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此,而且使用圆括号能消除歧义,增加可读性。


5.5 范围操作符 in (set)


使用 in 操作符可以指定条件范围,范围中的每个条件都可以进行匹配。in 要匹配的值放在其后的圆括号中:


# 找出id为 1003 或 1001 的供应商
select * from products where vend_id in (1001, 1003);
复制代码


in 操作符可以用 or 来取代,在以下情况建议使用 in


  1. 在选项比较多时,in 更清楚且更直观;
  2. 使用 in 时,计算的次序更容易管理(因为使用的操作符更少);
  3. in 一般比 or 操作符清单执行更快;
  4. in 的最大优点是可以包含其他 select 语句,使得能够更动态地建立 where 子句。


5.6 逻辑否操作符 not


not 否操作符可以和前面的 inbetween and 一起使用,表示对范围取反:


# 找出id不为 1001 1003 的产品
select * from products where vend_id not in (1001, 1003);
# 选择产品价格不在 5 到 15 之间的产品
select * from products where prod_price not between 5 and 15;
复制代码


5.7 like 操作符


比如想找出名称中包含 anvil 的所有产品,可以通过 like 操作符来进行搜索。


like 表示后面跟的搜索模式使用通配符匹配而不是直接相等匹配。


操作符 %


最常使用的通配符是 % 操作符,% 表示任意多个字符,包括没有字符。


# 找出产品名字以 jet 开头的产品
select * from products where prod_name like 'jet%';
# 找出产品名中含有 on 的产品
select * from products where prod_name like '%on%';
# 找出产品名以 s 开头,以 e 结束的产品
select * from products where prod_name like 's%e';
复制代码


注意,% 是无法匹配 null 的。


操作符 _


_ 表示任意单个字符。


select * from products where prod_name like '_ ton anvil';
复制代码


另外,转译使用 \,比如 \_


# 找到描述中有 % 的产品
select * from products where prod_desc like '%\%%';
复制代码


注意:


  1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  2. 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。


5.8 正则表达式 regexp


关于正则表达式,可以先简单看一下 「正则表达式必知必会」 这篇博客。


使用 regexp 关键字来表示匹配其后的正则表达式:


# 找到产品名以 1000 或 anvil 结尾的产品
select * from products where prod_name regexp '1000|anvil$';
复制代码


正则表达式中转译使用 \\,比如希望查找 . 这个字符而不是正则中的 . 通配符,使用 \\.,为了转移 \ 这个字符,使用 \\\


# 找到产品名以 . 字符开头的产品
select * from products where prod_name regexp '^\\.';
复制代码


6. 计算字段


有时候我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化,这时我们就需要计算字段了。


6.1 别名 as


查询出来的虚拟表格可以起一个别名,方便理解,可读性好,另外如果查询的字段有重名的情况,可以使用别名 as 来区分开来。


# 使用 as 关键字
select cust_name as name from customers;
# as 关键字也可以直接省略
select cust_name name from customers;
# 可以给不同字段分别起别名
select cust_name name, cust_city location from customers;
复制代码


6.2 拼接 concat


想把多个字段连接成一个字段,可以使用到拼接字段函数 concat


# 将供应商的名字和地点拼接好后返回,并命名为 vend
select concat(vend_name, '(', vend_country, ')') vend from vendors;
复制代码


注意中间如果有任何一个数据为 null,拼接的结果也是 null


所以对某些可能为 null 的字段要使用 ifnull 函数判断一下,第一个参数为要判断的字段,第二个参数是如果是 null 希望返回的结果:


# 将顾客信息拼接起来
select concat(cust_name, '(', ifnull(cust_email, '-'), ')') customerInfo from customers;
复制代码


如果表中的数据前后有空格,可以使用 rtrim() 函数去除右边空格,ltrim() 去除左边空格,或者 trim() 去除前后空格:


# 将顾客信息处理后拼接起来
select concat(rtrim(vend_name), '(', trim(vend_country), ')') vend from vendors;
复制代码


6.3 算术计算 +-*/


基本的算术运算符在 select 语句中也是支持的:


# 计算订单每种总额,并按照总金额降序排列
select prod_id as id, quantity, quantity*item_price as totalPrice 
from orderitems order by totalPrice desc;
复制代码


基本运算符加减乘除都是支持的 +-*/



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
2月前
|
关系型数据库 MySQL 数据库
MySQL基本操作入门指南
MySQL基本操作入门指南
81 0
|
7天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
23 3
|
6天前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
13 1
|
21天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
54 9
|
1月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
83 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL入门到精通
MySQL入门到精通
|
3月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
157 0
|
3月前
|
SQL 关系型数据库 MySQL
(二十五)MySQL主从实践篇:超详细版读写分离、双主热备架构搭建教学
在上篇《主从原理篇》中,基本上把主从复制原理、主从架构模式、数据同步方式、复制技术优化.....等各类细枝末节讲清楚了,本章则准备真正对聊到的几种主从模式落地实践,但实践的内容通常比较枯燥乏味,因为就是调整各种配置、设置各种参数等步骤。
542 2
|
3月前
|
存储 关系型数据库 MySQL
深入MySQL:事务日志redo log详解与实践
【8月更文挑战第24天】在MySQL的InnoDB存储引擎中,为确保事务的持久性和数据一致性,采用了redo log(重做日志)机制。redo log记录了所有数据修改,在系统崩溃后可通过它恢复未完成的事务。它由内存中的redo log buffer和磁盘上的redo log file组成。事务修改先写入buffer,再异步刷新至磁盘,最后提交事务。若系统崩溃,InnoDB通过redo log重放已提交事务并利用undo log回滚未提交事务,确保数据完整。理解redo log工作流程有助于优化数据库性能和确保数据安全。
545 0