Mysql——事务/索引/视图/三范式

事务Transaction

事务概述

1.事务
一个事务是一个完整的业务逻辑单元,不可再分。
在这里插入图片描述
比如:银行账户转账,从A账户向B账户转账10000,需要执行两条update语句:

update t_act set balance = balance - 10000 where actno = 'act-001';
update t_act set balance = balance + 10000 where actno = 'act-002';

以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。

要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”。

2.事务相关语句
和事务相关的语句只有:DML语句。(insert delete update)

因为它们这三个语句都是和数据库表当中的“数据”相关的。事务的存在是为了保证数据的完整性,安全性。

3.解释说明
假设所有的业务都能使用1条DML语句搞定,就不需要事务机制了。

但实际情况不是这样的,通常一个“事儿(事务【业务】)”需要多条DML语句共同联合完成。

事务原理

假设一个事务,需要先执行一条insert语句,再执行一条update语句,最后执行一条delete语句,整个事务才算完成。
在这里插入图片描述
若提交事务commit,三条DML语句会对磁盘文件做出修改,同时数据库中三条历史操作会被清除;
若回滚事务rollback,三条DML语句不会对文件执行操作,并且数据库中的历史操作会被清除。

事务特性

事务包括四大特性:ACID
A: 原子性:事务是最小的工作单元,不可再分。
C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
I:隔离性:事务A与事务B之间具有隔离。
D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

事务之间的隔离性

事务隔离性存在隔离级别,理论上隔离级别包括4个:

第一级别:读未提交(read uncommitted)
  对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。读未提交存在脏读(Dirty Read)
  现象:表示读到了脏的数据,数据不稳定。

第二级别:读已提交(read committed)
  对方事务提交之后的数据我方可以读取到。
  这种隔离级别解决了: 脏读现象没有了。
  读已提交存在的问题是:不可重复读。(多次读到不同的数据,读到最新的改变过的数据。)

第三级别:可重复读(repeatable read)
  这种隔离级别解决了:不可重复读问题。事务未结束前读到的数据是一致的,接收不到对方更新的数据。
  这种隔离级别存在的问题是:读取到的数据是幻象。

第四级别:序列化读/串行化读(serializable)
  解决了所有问题。
  效率低。需要事务排队。

  oracle数据库默认的隔离级别是:读已提交。
  mysql数据库默认的隔离级别是:可重复读。

演示事务

mysql事务默认情况下是自动提交的。只要执行任意一条DML语句则提交一次。
可以使用 start transaction;关闭自动提交。

演示:mysql中的事务是支持自动提交的,只要执行一条DML,则提交一次。

mysql> drop table if exists t_user;
mysql> create table t_user(
    -> id int primary key auto_increment,
    -> username varchar(255)
    -> );
mysql> insert into t_user(id,username) values(1,'zs');
mysql> rollback;
#此时执行rollback并不能将插入的数据撤回掉。

演示:使用start transaction;关闭自动提交机制。

mysql> start transaction;
mysql> insert into t_user(username) values('lisi');
mysql> insert into t_user(username) values('Rose');
mysql> rollback;
mysql> select * from t_user;
#此时表中是没有'lisi','Rose'这两条记录的。事务回滚到最初了。

mysql> start transaction;
mysql> insert into t_user(username) values('Jack');
mysql> insert into t_user(username) values('Alice');
mysql> commit;
mysql> select * from t_user;
#提交了事务,表有'Jack','Alice'两条记录。rollback也回不去了。

1.读未提交

mysql> set global transaction isolation level read uncommitted;

2.读已提交

sql> set global transaction isolation level read committed;

3.可重复读

sql> set global transaction isolation level repeatable read;

查看事务的全局隔离级别:

mysql> select @@global.tx transaction

索引

1.索引的概念、作用
索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。

在数据库方面,查询一张表的时候有两种检索方式:
  第一种方式:全表扫描
  第二种方式:根据索引检索(效率很高)

索引提高检索效率最根本的原理是缩小了扫描的范围。
添加索引是给某一个字段,或者说某些字段添加索引。

索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。

2.索引的创建和删除

创建索引对象:
  create index 索引名称 on 表名(字段名);
删除索引对象:
  drop index 索引名称 on 表名;

3.添加索引的条件

  • 数据量庞大。(根据客户的需求,根据线上的环境)
  • 该字段很少的DML操作。(因为字段进行修改操作,索引也需要维护)
  • 该字段经常出现在where子句中。(经常根据哪个字段查询)

注意:主键和具有unique约束的字段自动会添加索引。
  根据主键查询效率较高。尽量根据主键检索。

4.查看sql语句的执行计划

mysql> explain select ename,sal from emp where sal = 5000;

在这里插入图片描述

mysql> create index emp_sal_index on emp(sal);
mysql> explain select ename,sal from emp where sal=5000;

在这里插入图片描述
5.索引实现原理
索引底层采用的数据结构是:B + Tree

通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。
在这里插入图片描述

mysql> select ename from emp where ename = 'SMITH';
  #通过索引转换为:
mysql> select ename from emp where 物理地址 = 0x3;

6.索引的分类
  单一索引:给单个字段添加索引
  复合索引: 给多个字段联合起来添加1个索引
  主键索引:主键上会自动添加索引
  唯一索引:有unique约束的字段上会自动添加索引
  …

7.索引失效

mysql> select ename from emp where ename like '%A%';

模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。索引第一个字母无法定位。

视图

站在不同的角度去看待数据。(同一张表的数据,通过不同的角度去看待)。

1.视图创建/删除

#创建视图:
create view myview as select empno,ename from emp;
#删除视图:		
drop view myview;

2.对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)。可以对视图进行CRUD操作。

3.操作

mysql> create table emp_bark as select * from emp;

#这样操作原表会发生改变
mysql> update myview1 set ename='Rose',sal=2000 where empno=7369;
mysql> delete from myview1 where empno=7369;

4.视图的作用
视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,程序员只对视图对象进行CRUD。

DBA命令

1.将数据库当中的数据导出
在windows的dos命令窗口中执行:(导出整个库)

mysqldump 库名>文件路径 -uroot -p333
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333

在windows的dos命令窗口中执行:(导出指定数据库当中的指定表)

mysqldump 库名 表名>路径 -uroot –p123
mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123

2.导入数据

mysql> create database bjpowernode;
mysql> use bjpowernode;
mysql> source D:\bjpowernode.sql

数据库设计三范式

1.设计范式
设计表的依据。按照这个三范式设计的表不会出现数据冗余。

2.第一范式
任何一张表都应该有主键,并且每一个字段原子性不可再分。

3.第二范式
建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。

多对多:三张表,关系表两外键
在这里插入图片描述
4.第三范式
建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。

一对多:两张表,多的表加外键。
在这里插入图片描述

PS:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。

5.一对一的设计
(1)主键共享

在这里插入图片描述
(2)外键唯一
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、约束:作用是保证数据的完整性和一致性 not null 表示该字段数据不能为空 default 表示该字段的默认值 unique 唯一(列唯一,组合唯一) primary key 主键 一张列表中只允许出现一个主键(not null + unique) auto-increment 自增长 foregin key 外键 建立两个表之间的联系 语法 constraint fk_dep foreign key(关联列名) references 被关联表(被关联列) on delete cascade 同步删除 on update cascade 同步更新 二、Mysql基本介绍 操作文件夹(库): 增加一个库:create database db1 charset utf8; 查看所有库: show databases; 查看特定库: show create database db1; 删库跑路: drop database db1; 操作文件(表): 切换进数据库:use db1; 查看当前所在文件夹;select database( ); 增加表:create table t1(id int,name char(6)); 查看特定表:show create table t1; 查看所有表:show tables;或者desc t1; 改: alter table t1 modify name char(10);name字段改为10字节; alter table t1 modify name NAME char(10);name字段名改成NAME 复制表 即复制表数据也复制表结构:create table t1 select * from db1.t1; 只复制表结构create table a1 like db1.t1; 清空表 delete from t1;但是这种方法会保留自增的ID truncate table t1;这种方法不会保留自增ID 操作文件内容 增加内容:insert into (id,name) values(1,'aa'),(2,'bb'),(3,'cc'); 查看内容:select * from db1.t1; 删除内容:delete from t1 where id =1; 查看用户权限:select * from mysql.user where user='root'\G; 、SQL数据类型 SQL之中没有bool值,tinyint[1]表示true;tinyint[0]表示fasle. int数据类型后面存储的是显示宽度,而不是存储宽度,其他的数据类型则表示的是存储宽度 now()sql中的内置函数,根据数据类型生成相对应的时间模式 char( )定长字符串,存储速度快,但是浪费空间 varchar( )变长字符串,存储速度慢,可是节省空间 enum() 表示枚举 多选一 set( )表示集合 多选多 七、索引 索引的作用:约束和加速查找 无索引的时候一般会 从前至后一条条查找 有索引的时候:创建索引的本质就是创造额外的文件,查询时先去额外的文件找,定好位置,再去原始表直接查询,提高查询速度,但是增删改的速度依然慢,创建索引后必须命中索引才有效 索引的分类 1、普通索引:加速查询 加入索引:create index 索引名 on 表名(列名) 删除索引: drop index 索引名 on 表名 查看索引:show index from 表名 2、唯一索引:加速查找和唯一约束(可含null) 加入索引:create unique index 索引名 on 表名(列名) 删除:drop index 索引名 on 表名 3、主键索引 加入索引:alter table 表名 add primary key(列名) 删除索引:alter table 表名 drop primary key(列名)和alter table 表名 modify 列名 int,drop primary key 4、组合索引:将多个列组合成一个索引 创建组合索引:create iindex 索引名 on 表名(列1,列2) 在使用组合索引时,若组合索引为(name,email),单独索引email时不走索引,这称为最左前缀匹配原则,最左匹配原则中,mysql会一直向右匹配知道遇到(< > between like)这一类的范围查询时停止 explain + sql查询语句,用于查询sql执行信息参数 在使用关键字‘like’查询时:like ‘n%’ 走索引;但是like ‘%n%’不走索引,即有且仅只有后面带上%时走索引 使用函数时索引不生效

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值