MySQL数据库复习(4)----存储引擎,事务,索引,视图和设计三范式

写在最前面:本博文如有错误,还望指出,谢谢

其它相关文章

MySQL数据库复习(1)----单表查询sql语句
MySQL数据库复习(2)----多表查询和增删改sql语句
MySQL数据库复习(3)------约束

九、存储引擎

1.完整的建表语句

例:

CREATE TABLE `login` (
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `name` varchar(100) NOT NULL,
  `tel` varchar(15) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

注意:在Mysql当中,凡是标识符可以用飘号括起来的
建表的时候可以使用存储引擎,也可以指定字符集。
MySQL默认使用的存储引擎是InnoDB方式
默认采用的字符集是UTF8

2.什么是存储引擎?

存储引擎这个名字只在mysql中存在,Oracle中有对应的机制,但不叫存储引擎。Oracle中叫做“表的存储方式”
MySQL支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式
每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎

3.查看当前MySQL支持的存储引擎

show engines \G
mysql 8.0.19.0支持的存储引擎有9个

*************************** 1. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 8. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO

4.常见的存储引擎?

1)MyISAM存储引擎
这种存储引擎不支持事务,MyISAM是MySQL最常用的存储引擎
使用三个文件表示每个表
a)存储表结构的定义(mytable.frm)–格式文件
b)存储表行的内容(mytable.MYD) --数据文件
c)存储表上的索引(mytable.MYI)—索引文件

优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率
缺点:不支持事务
2)InnoDB存储引擎
InnoDB存储引擎是MySQL默认的缺省引擎
优点:支持事务,行级锁,外键等。这种存储引擎数据的安全得到保障
表的结构存储在xxx.frm文件中
数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
这种存储引擎在MySQL数据库崩溃之后提供自动恢复
InnoDB支持级联删除和级联更新
3)MEMORY存储引擎
缺点:不支持事务,数据容易丢失,因为所有数据和索引都存在内存当中的
优点:查询速度最快

十、事务(transaction)

1.什么是事务?

一个事务是一个完整的业务逻辑单元,不可再分
比如:银行账户转账,从A账户向B账户转账1000元,需要执行两条update语句,更新两张表

update t_act set balance = balance – 1000 where actno =001;
update t_act set balance = balance + 1000 where actno =002;

以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败
要想保证以上两条DML语句同时成功或者同时失败,那么就需要使用数据库的事务机制

2.和事务相关的SQL语句

和事务相关的语句只有DML语句(insert delete update)
因为只有这三个语句是和数据库表中的数据相关的
事务的存在是为了保证数据的完整性,安全性

3.需要事务的原因

一个业务通常需要多条DML语句完成,因此需要事务

4.事务的四大特性

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

5.事务的隔离性

事务隔离性存在隔离级别,理论上隔离级别包括4个
第一级别:读未提交(read uncommitted)
对方事务还未提交,我们当前事务可以读取到对方未提交的数据
读未提交存在脏读(dirty read)现象:表示读到了脏数据
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到
这种隔离级别解决咯脏读现象
存在的问题:不可重复读
第三级别:可重复读(repeatable read)
这种隔离级别解决了不可重复读问题
存在问题:读取到的数据不一定是真实的
第四级别:序列化/串行化读
解决了所有问题,但效率低,需要事务排队
Oracle数据库默认的隔离级别是:读已提交
MySQL数据库默认的隔离级别是:可重复读

6.演示事务

MySQL事务默认情况下是自动提交的,只要执行任意一天DML语句则提交一次
关闭自动提交的方法:start transaction;
设置事务的隔离级别为一级:set global transaction isolation level read uncommitted;
查看事务的全局隔离级别:select @@global.tx_isolation;
两个sql语句:commit和rollback

十一、索引

1.什么是索引?有什么用?

索引就相当于一本书的目录,通过目录可以快速地找到对应的资源
在数据库方面,查询一张表的时候有两种检索方式
1)全表扫描
2)根据索引检索(效率很高)

索引缩小了扫描的范围
索引虽然可以提高检索效率,但不能随意地添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要排序,进行维护
添加索引是给某一个字段,或者说某些字段添加索引

select ename,sal from emp where ename = ‘ABC’;

当ename字段上没有添加索引的时候,以上sql语句会进行全表扫描,扫描ename字段中所有的值
当ename字段上添加索引的时候,以上sql语句会根据索引扫描,快速定位

2.怎么创建索引对象?怎么删除索引对象?

create index 索引名称 on 表名(字段名);
drop index 索引名称 on 表名;

3.什么时候考虑给字段添加索引?

1)数据量庞大
2)该字段很少进行DML操作
3)该字段经常出现在where子句中

4.注意:主键和具有unique约束的字段自动会添加索引

因此根据主键查询效率较高

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

使用explain查看执行计划

explain select ename from emp where sal = 5000;

给sal字段添加索引

create index emp_sal_index on emp(sal);

6.索引底层采用的数据结构

索引底层采用的数据结构是:B Tree

7.索引的实现原理

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

8.索引的分类

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

9.索引什么时候失效?

模糊查询的时候,第一个通配符使用的是%,这个时候索引会失效
比如:

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

十二、视图

1.什么是视图?

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

2.创建和删除视图

create view myview as select empno,ename from emp;
drop view myview;

注意:只有DQL语句才能创建视图对象

3.对视图进行增删改查,会影响到原表数据

通过视图影响原表数据,不是直接操作原表
可以对视图进行CRUD操作

4.面向视图进行操作

update myview set ename = ‘aa’ where empno = 777;
delete from myview where ename = ‘aa’;

5.视图的作用

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

十三、DBA命令

1.将数据库中的数据导出

在Windows的dos命令窗口中执行
导出abc这整个数据库

mysqldump abc>D:abc.sql -uroot -p111

2.导入数据

create database abc;
use abc;
source D:\abc.sql;

十四、数据库设计三范式(重点)

1.什么是设计范式?

设计表的依据,按照三范式设计的表不会出现数据冗余

2.三范式的定义

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分
第二范式:在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部份依赖
多对多?三张表两个外键
第三范式:在第二范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖
一对多?两张表,多的表加外键
注意:在实际开发中,为了满足客户的需求,有时候会拿冗余换速度

3.表的经典设计方案

一对一设计
一对一设计有两种方案
a)主键共享:用户登陆表和用户详细信息表的主键id是共享的
b)外键唯一
本笔记网课来源
https://www.bilibili.com/video/BV1fx411X7BD

猜你喜欢

转载自blog.csdn.net/weixin_46841376/article/details/112675970