0103 MySQL06

news2025/1/24 10:47:43

1.事务

1.一个事务其实就是一个完整的业务逻辑

如:转账,从A账户向B账户转账10000,将A账户的钱减去10000(update),将B账户的钱加上10000(update),这就是一个完整的业务逻辑

以上操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分

只有DML语句才会有事务(insert,delete,update),因为这些语句是数据库表中数据进行增删改的,只要一旦涉及增删改,一定要考虑安全问题


2.对事务的理解

假设所有业务只要一条DML语句就能完成,还有必要存在事务机制吗?

不必要,没有存在的价值,正是做某件事需要多条DML语句联合才能完成,所以需要事务的存在

说到底,一个事务其实就是多条DML语句同时成功,或同时失败


3.事务如何实现批量DML语句同时成功或失败?

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

事务开启:

insert

delete

update

update

....

事务结束

在事务执行过程中,每一条DML的操作都会记录到’事务性活动的日志文件‘中,在这个过程中,可以提交事务,也可以回滚事务

提交事务?

清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中,提交事务标志着事务的结束,且是一种全部成功的结束

回滚事务?

将之前所有的DML操作全部撤销,且清空事务性活动的日志文件,标志着事务的结束,且是一种全部失败的结束


4.怎么提交事务?怎么回滚事务?

提交事务:commit;

回滚事务:rollback;(只能回滚到上一次的提交点)

事务对应的英文:transaction

在MySQL默认的事务行为?

默认情况下支持自动提交事务,每执行一条DML语句,则提交一次

自动提交不符合开发习惯,因为一个业务通常需要多条DML语句共同执行,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一次

将MySQL自动提交机制关闭?

start transaction;开启事务

演示事务:

start transaction;

insert into dept_bak values(10,'abc','aa');

insert into dept_bak values(10,'abc','bb');

select * from dept_bak;//有数据

rollback;

select * from dept_bak;//Empty


5.事务的四个特性

原子性:说明事务是最小的工作单元,不可再分

一致性:在同一个事务中,所有操作必须同时成功或同时失败,保证数据一致性

隔离性:A事务和B事务之间具有一定隔离。

持久性:事务最终结束的一个保障,事务提交就相当于将没有保存到硬盘上的数据保存到硬盘上


6.隔离级别

A教室和B教室中有一道墙,可以很厚也可以很薄,这就是事务的隔离级别

4个隔离级别?

读未提交:read uncommitted(最低隔离级别)《没有提交就读到》

        事务A可以读取到事务B未提交的数据,存在脏读(Dirty read)现象,即读到了脏数据

这种隔离级别一般都是理论上的,大多数数据库隔离级别都是二档起步

读已提交:read committed《提交后读到》

        事务A只能读取到事务B提交之后的数据,解决了脏读现象,存在不可重复读取数据问题,

这种隔离级别是比较真实的数据,每一次读到的数据绝对真实,Oracle数据库默认的隔离级别

        不可重复读取数据?

        在事务开启后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取时,读到的数据是4条,称为不可重复读取

可重复读:repeatable read《提交后也读不到》

        事务A开启之后,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改且提交,事务A读取到的数据还是没发生改变,解决了不可重复读的问题,存在了幻影读问题,每一次读取的数据都是幻象,不够真实,永远读取的都是刚开启事务时的数据。MySQL默认的隔离级别

序列化/串行化:serializable(最高隔离级别)

最高隔离级别,效率最低,解决了所有问题

这种隔离级别表示事务排队,不能并发


7.演示各种隔离级别

查看隔离级别:select @@tx_isolation

1.演示read uncommitted

set global transaction isolation level read uncommitted;设置全局隔离级别为读未提交

事务A:

start transaction;

select * from t_user;//能查询到事务B未提交数据

事务B:

start transaction;

insert into t_user values('zhangsan');//未提交


2.演示read committed

set global transaction isolation level read committed;

事务A:

start transaction;

select * from t_user;//不能查询到

select * from t_user;//commit后能查询到

事务B:

start transaction;

insert into t_user values('zhangsan');//未提交

commit;//提交


3.演示repeatable read

set global transaction isolation level repeatable read;

事务A:​​​​​​​

start transaction;

select * from t_user;//不能查询到

select * from t_user;//commit后也不能查询到

事务B:

start transaction;

insert into t_user values('zhangsan');//未提交

commit;//提交


4.演示serializable

set global transaction isolation level serializable;

事务A:​​​​​​​

start transaction;

select * from t_user;//光标卡着不动,等待另一个事务提交

select * from t_user;//提交后可查询到

事务B:

start transaction;

insert into t_user values('zhangsan');//未提交

commit;//提交


2.索引

索引(index)是在数据库表的字段上添加,为了提高查询效率存在的一种机制,一张表的一个字段可以添加一个索引,多个字段联合起来也可以添加索引,相当于一本书的目录,为了缩小扫描范围而存在的一种机制

在MySQL数据库当中索引也需排序,索引排序和TreeSet数据结构相同,底层是一个自平衡二叉树,在MySQL当中索引是一个B-Tree数据结构,遵循左小右大原则,采用中序遍历

索引是各种数据库进行优化的重要手段,优化时优先考虑的因素就是索引


1.索引的实现原理

假设有一张用户表t_user

id(pk)name硬盘上物理存储编号
100zhangsan0x1111
120lisi0x2222
99wangwu0x8888
130zhaoliu0x9999
55jack0x6666

idIndex(id字段的索引对象)

select * from t_user where id = 130;

MySQL发现id字段上有索引对象,会通过索引对象idIndex进行查找

通过索引对象定位到:130,得出物理编号:0x9999,此时SQL语句转换:

select * from t_user where 物理编号 = 0x9999;

注1:在任何数据库当中,主键上都会自动添加索引对象,即id字段上自动有索引,在MySQL中,一个字段上如果有unique约束,也会自动创建索引对象

注2:在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号

注3:在MySQL中,索引是一个单独的对象,不同的存储引擎以不同形式存在。在MyISAM存储引擎中,索引存储在一个.MYI文件中,在InnoDB存储引擎中,索引存储在tablespace中,在MEMORY存储引擎中,索引存储在内存里。

什么条件下会考虑给字段添加索引?

1.数据量庞大

2.该字段经常出现在where后面,以条件形式存在,即这个字段总是被扫描

3.该字段很少DML(增删改)操作(因为DML后索引需重新排序)


2.索引的创建和删除

创建索引:

create index emp_ename_index on emp(ename);

给emp表的ename字段添加索引,起名:emp_ename_index

删除索引:

drop index emp_ename_index on emp;

将emp表上的emp_ename_index索引对象删除

查看一个SQL语句是否使用索引进行检索?

explain select * from emp where ename = 'Jack';

//type=ALL,扫描了14条记录,说明没有使用索引

create index emp_ename_index on emp(ename);

explain select * from emp where ename = 'Jack';

//type=ref,扫描了1条记录,使用了索引


3.索引失效

失效1:

select * from emp where ename like '%T';

//即使添加了索引,也不会走索引,因为模糊匹配当中以%开头了,应尽量避免模糊查询%开头

失效2:

select * from emp where ename = ‘jack’ or job = 'manager';

//使用or,要求两边条件字段都要有索引,否则不走索引

失效3:

creat index emp_job_sal_index on emp(job,sal);

select * from emp where job = 'manager';//使用索引

select * from emp where sal = 3000;//失效

//使用复合索引,没有使用左侧的列查找,索引失效

失效4:

create index emp_sal_index on emp(sal);

select * from emp where sal+1 = 3000;

//在where当中索引列参加了运算,索引失效

失效5:

select * from emp where lower(ename) = 'jack';

//在where当中索引列使用了函数

失效6,7.....


4.索引的分类

单一索引:一个字段上添加索引

复合索引:两个字段或多个字段上添加索引

主键索引:主键上添加索引

唯一性索引:具有unique约束的字段添加索引

.....

注:唯一性比较弱的字段上添加索引用处不大


3.视图

view:站在不同的角度去看待同一份数据

1.创建视图,删除视图?

创建:

create view dept_view as select * from dept;

删除:

drop view dept_view;

注:只有DQL语句才能以view的形式创建

create view dept_view as DQL语句


2.用视图做什么?

可以面向视图对象进行增删改查,会导致原表被操作(即对视图操作,影响原表数据)

create view dept_view as select * from dept;

insert into dept_view(deptno,dname,loc) values(1,'sales','beijing');//原表插入数据

delete from dept_view;//原表被删除

在实际开发中的作用?

假设有一条非常复杂的SQL语句,而这条语句需要在不同位置上反复使用,每一次使用都需要重新编写,很麻烦,这时可把这条SQL语句以视图对象形式新建,在需要编写SQL语句时直接使用视图对象,大大简化开发,且利于后期维护,只需要修改视图对象所映射的SQL语句

视图不是在内存当中,也存储在硬盘上,不会消失

再次注意:视图对应的语句只能是DQL语句,但视图对象创建完成后,可对视图进行增删改查

补充:增删改查又叫CRUD

C:create(增)

R:retrieve(查,检索)

U:update(改)

D:delete(删)


4.DBA命令(了解)

1.新建用户

create user xxx identified by '123456';

2.授权

....

3.回收

..

4.数据的导入和导出(掌握)

数据导出:

mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p***

导出指定的表:

mysqldump bjpowernode emp>...

//在dos命令窗口中导出

数据导入

创建数据库:create database bjpowernode;

使用数据库:use bjpowernode;

初始化数据库:source D:\bjpowernode.sql

//先登录到MySQL数据库服务器上


5.数据库设计三范式

数据库设计范式?

数据库的设计依据,教你怎么进行数据库表的设计

第一范式:要求如何一张表必须有主键,每一个字段原子性不可再分

第二范式:建立在第一范式的基础上,要求所有非主键字段完全依赖主键,不要产生部分依赖

第三范式:建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖

设计数据库表时,按照以上范式,可避免表中数据冗余,空间浪费


1.第一范式

最核心,最重要的范式,所有表的设计都需满足

必须有主键,且每个字段都是原子性不可再分

编号姓名联系方式
1000张三zs@123.com,13959999999
1001李四ls@123.com,13956666666
1002王五ww@123.com,13958888888

以上学生表不满足第一范式:

1.没有主键

2.联系方式可再分为邮箱和电话

编号(pk)姓名邮箱电话
1000张三zs@123.com13959999999
1001李四ls@123.com13956666666
1002王五ww@123.com13958888888

口诀?一对一若表很庞大,拆分为两张表

外键+unique约束

一对一,外键唯一


2.第二范式

建立在第一范式基础上,要求所有非主键字段必须完全依赖主键,不产生部分依赖

学生与老师关系表(1个学生可能有多个老师,1个老师可能有多个学生)

复合主键:学生编号+教师编号(pk)

学生编号教师编号学生姓名教师姓名
1001001张三王老师
1002002李四赵老师
1003001王五王老师
1001002张三赵老师

不满足第二范式:

‘张三’依赖1001,‘王老师’依赖001,产生了部份依赖

部份依赖缺点:数据冗余,空间浪费,‘张三’‘王老师’重复

为了满足第二范式,使用三张表表示多对多关系

学生表

学生编号(pk)学生名字
1001张三
1002李四
1003王五

教师表

教师编号(pk)教师名字
001王老师
002赵老师

学生教师关系表

id(pk)学生编号(fk)教师编号(fk)
11001001
21002002
31003001
41001002

口诀:多多对怎么设计?

多对多,三张表,关系表两个外键!


3.第三范式

建立在第二范式基础上,要求所有非主键字段必须直接依赖主键,不产生传递依赖

学生编号(pk)学生姓名班级编号班级名称
1001张三01高三一班
1002李四02高三二班
1003王五03高三三班
1004赵六03高三三班

以上表格满足第一范式(有主键),满足第二范式(主键不是复合主键,没有产生部分依赖)

不满足第三范式:

高三一班依赖01,01依赖1001,产生了传递依赖,产生了数据冗余

设计一对多?

班级表:一

班级编号(pk)班级名称
01高三一班
02高三二班
03高三三班

学生表:多

学生编号(pk)学生姓名班级编号(fk)
1001张三01
1002李四02
1003王五03
1004赵六03

口诀?

一对多,两张表,多的表加外键


注:数据库设计三范式是理论上的,实践上有偏差,最终目的是为了满足客户需求,有时会拿冗余换执行速度,因为SQL中,表和表之间连接次数多,效率越低(笛卡尔积),有时可能存在冗余,但为了减少表的连接次数,这样做也合理,对于开发人员来说,SQL语句的编写难度也降低

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

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

相关文章

【Mybatis】| 如何创建MyBatis的工具类

目录🌟更多专栏请点击👇一、前言二、实现过程1. 创建一个ThreadLocal对象2. 初始化SqlSessionFactory3. 获取并存储sqlSession对象4. 关闭sqlSession对象三、 总代码🌟更多专栏请点击👇 专栏名字🔥Elasticsearch专栏e…

向2022年度商界木兰上榜女性致敬!

目录 信息来源: 2022年度商界木兰名单 简介 评选标准 动态 榜单 为你心中的2023商界女神投上一票 信息来源: 2022年度商界木兰榜公布 华为孟晚舟获商界木兰最高分 - 脉脉 【最具影响力女性】历届商界木兰榜单 中国最具影响力的30位商界女性名单…

基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目

本文是专栏《手把手带你做一套毕业设计毕业设计》的实战第一篇,将从Vue脚手架安装开始,逐步带你搭建起一套管理系统所需的架构。当然,在默认安装完成之后,会对文件目录进行初步的细化拆分,以便后续功能迭代和维护所用。…

经典100道mysql的面试题

100道mysql的面试题 目录100道mysql的面试题1. MySQL 索引使用有哪些注意事项呢?索引哪些情况会失效索引不适合哪些场景索引的一些潜规则2. MySQL 遇到过死锁问题吗,你是如何解决的?3. 日常工作中你是怎么优化SQL的?4. 说说分库与…

字体反爬慢慢总结破解方式

什么是字体反爬 网页开发者自己创造一种字体,因为在字体中每个汉字都有其代号,那么以后再网页中不会直接显示这个文字的效果。而是显示其代号,因此即使获取了网页的文本内容。也只是获取到文字的代号,而不是文字本身。 简单来说&…

逻辑优化基础-shannon decomposition

1. 简介 在逻辑综合中,香农分解(Shannon decomposition)是一种常用的布尔函数分解方法。它将一个布尔函数分解为两个子函数的和,其中每个子函数包含一个布尔变量的取反和非取反的部分。 具体来说,假设对于一个布尔函…

Mysql 索引特点

承接上文Mysql Server原理简介聚簇索引、二级索引、联合索引分别具备什么样的特点?聚簇索引数据跟索引放在一起的叫聚簇索引;数据和索引分开存储的叫非聚簇索引;innodb存储引擎,数据和文件都放在ibd文件中,实际的数据是…

在教学中常被问到的几个vue3.x与typescript的问题,统一解答

在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…

「ML 实践篇」机器学习项目落地

文章目录1. 项目分析1. 框架问题2. 性能指标2. 获取数据1. 准备工作区2. 下载数据3. 查看数据4. 创建测试集3. 数据探索1. 地理位置可视化2. 寻找相关性3. 组合属性4. 数据准备1. 数据清理2. Scikit-Learn 的设计3. 处理文本、分类属性4. 自定义转换器5. 特征缩放6. 流水线5. 选…

Linux入门介绍及Linux文件与目录结构

前言 本文小新为大家带来 Linux 入门介绍及Linux 文件与目录结构 相关知识,具体内容包括Linux入门介绍(包括:Linux概述,Linux与Windows区别,CentOS 下载地址),Linux文件与目录结构等进行详尽介绍…

实验7 图像水印

本次实验大部分素材来源于山大王成优老师的讲义以及冈萨雷斯(MATLAB版),仅作个人学习笔记使用,禁止用作商业目的。 文章目录一、实验目的二、实验例题1. 数字图像水印技术2. 可见水印的嵌入3. 不可见脆弱水印4. 不可见鲁棒水印一、…

自指(Self-reference)

文章目录1. 在逻辑、数学和计算方面2. 在生物学中3. 在艺术4. 在语言中5. 在流行文化中6. 在法律中自我参照(Self-reference)是一个涉及指代自己或自己的属性、特征或行为的概念。它可以发生在语言、逻辑、数学、哲学和其他领域。 在自然语言或形式语言…

JVM调优面试题——垃圾回收专题

文章目录1、如何确定一个对象是垃圾?1.1、引用计数法1.2、可达性分析2、对象被判定为不可达对象之后就“死”了吗?3、都有哪些垃圾收集算法?3.1、 标记-清除(Mark-Sweep)3.2、标记-复制(Mark-Copying)3.3、标记-整理(Mark-Compact)3.4、分代收…

车载技术【USB接口】—Android配件协议AOA【AOA连接】

简述 AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件…

Linux操作系统安装——服务控制

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

yocto 如何添加python module

yocto 如何添加python module 最近在使用阿里云的图像识别SDK,在ubuntu主机上使用pip install alibabacloud_imagerecog20190930 安装modules以后就可以运行demo程序了,于是打算将SDK移植到嵌入式板子上面,然后在板子上跑一下demo。但是发现…

AcWing数据结构 - 数据结构在算法比赛中的应用(下)

目录 Trie树 Trie字符串统计 最大异或对 并查集 合并集合 连通块中点的数量 食物链 堆 堆排序 模拟堆 哈希表 模拟散列表 字符串哈希 Trie树 Trie字符串统计 思路: 设 idx索引用于构建树, 结点son[节点位置][节点分支指针],cnt[]记录单…

TypeScript深度剖析: typescript 的数据类型有哪些?

一、是什么 typescript 和 javascript几乎一样,拥有相同的数据类型,另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段,可以为明确的变量定义为某种类型,这样typescript就能在编译阶段进行类型检查,…

06-Oracle表空间与用户管理

本讲主要内容: 1.表空间管理:表空间的作用,创建,修改,删除及管理; 2.用户管理:创建用户,修改用户,删除用户,修改密码,解锁; 3.用户…

【LeetCode】13. 罗马数字转整数

题目链接:https://leetcode.cn/problems/roman-to-integer/ 📕题目要求: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 例如, 罗马数字 2 写做 II ,即…