MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~2

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: MySQL基础下篇[表的创建/约束的使用/事务和范式以及索引的使用]~2

在MySQL中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段(注:在Oracle中并非如此)

主键约束:primary key(简称PK)

主键值是每一行记录的唯一标识,相当于人类的“身份证号”

任何一张表都应该有主键,没有主键的表是无效的

主键的特征:not null+unique[主键值不能是null,同时也不能重复]

单一主键

给表添加主键约束:

使用列级添加主键约束:


使用表级添加主键约束:

复合主键

在实际开发中,不建议使用复合主键,因为本身主键存在的意义就是作为某条记录的唯一标识,单一主键能够达到该效果


列级主键约束只能添加一个:

主键值的类型建议使用:int,bigint,char等类型,不建议使用:varchar来做主键,主键值一般都是数字,是定长的


对于主键的类型,除了我们上文提到的单一主键和复合主键之外,我们还可以将主键分为自然主键和业务主键。


自然主键:主键值是一个自然数,和业务没有关系


业务主键:主键值和业务密切相关,例如:拿银行卡账号做主键


在实际开发中,自然主键使用的会比较多一些,因为主键只要做到不重复就行,不需要有意义,业务主键不太好,因为主键一旦和业务挂钩,那么当业务发生变动时,可能会影响主键的值,所以业务主键不是我们所推荐的

主键自增机制:

外键约束:foreign key(简称FK)

业务背景:请设计数据库表,来描述"班级和学生"的信息

第一种方案:班级和学生存储在一张表中


这种存储数据的缺点是:数据冗余,空间浪费

第二种方案:班级一张表,学生一张表


当t_student表中的cno字段没有任何约束的时候,可能会导致数据无效,会出现除了t_class表中,当前存在的100/101以外的其他数字,所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束,那么cno字段就是外键字段,cno字段中的每一个值都是外键值。


t_class是父表,t_student是子表:


删除表的顺序:先删子表,再删父表


若先删除父表,那么子表将会受到影响,因为它参照了父表中的很多数据


创建表的顺序:先创建父表,再创建子表


父表中的某些数据是子表建立的基础,因此,需要先建立父表


删除数据的顺序:先删除子表,再删除父表


如果先删除父表,那么子表将会不完整,因为它还在使用父表的数据


插入数据的顺序:先插入父表,再插入子表


子表需要使用父表的数据,因此没有父表,子表中的数据就是不完整的


举例:


子表中的外键引用的父表中的某个字段,被引用的这个字段不要求必须是主键,但是必须具有唯一性

子表中的外键是可以为空的

检查约束:check(MySQL不支持,Oracle支持)

存储引擎的使用:

存储引擎是MySQL中特有的一个术语,其他数据库中没有(Oracle中有,但是并不叫存储引擎),它实际上是一个表存储/组织数据的方式,不同的存储引擎,表存储数据的方式不同


数据库中的各表均被[在创建表时]指定的存储引擎来处理,服务器可用的引擎依赖于以下因素:

MySQL的版本
服务器在开发时如何被配置
启动选项

为了解当前服务器中有哪些存储引擎可用,可使用show engines命令

在建表时,指定引擎:

使用show create table 表名命令,可查看该表的结构数据:


MySQL默认的存储引擎是:InnoDB
MySQL默认的字符编码方式是:utf8

在建表时,设置存储引擎和字符编码方式:


查看当前MySQL支持的引擎有哪些:

查看当前的MySQL版本:

MyISAM存储引擎是MySQL最常用的引擎

它管理的表具有以下特征:

使用三个文件表示每个表:
  格式文件-存储表结构的定义(mytable.fm)
  数据文件-存储表行的内容(mytable.MYD)
  索引文件-存储表上索引(mytable.MYI):相当于目录 ---缩小扫描范围,提升查询效率
灵活的AUTO_INCREMENT字段处理
MyISAM存储引擎的存储优势:可被转换为压缩,只读表来节省空间
MyISAM存储引擎的存储劣势:不支持事务,安全性较低

InnoDB存储引擎:

这是MySQL默认的存储引擎, InnoDB支持事务,支持数据库崩溃后自动恢复机制非常安全是它最大的一个特点

它管理的表具有下列主要特征:

 每个 InnoDB表在数据库目录中以.frm格式文件表示
 InnoDB表空间tablespace被用于存储表的内容(表空间是一个逻辑名称,表空间存储数据+索引)
 提供一组用来记录事务性活动的日志文件
 用commit(提交),savepoint及rollback(回滚)支持事务处理
 提供全acid兼容
 在MySQL服务器崩溃后提供自动恢复
 多版本(MVCC)和行级锁定
 支持外键及引用的完整性,包括联级删除和更新

InnoDB最大的特点就是支持事务:以保证数据的安全,效率不是很高,并且也不能压缩,不能转换为只读,不能很好地节省存储空间

MEMORY存储引擎:

使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得MEMORY存储引擎非常快


MEMORY存储引擎管理的表具有以下特征:

在数据库目录内,每个表均以.frm格式的文件表示
表数据及索引被存储在内存中
表级锁机制
不能包含TEXT或BLOB字段

MEMORY存储引擎之前被称为HEAP引擎

MEMORY存储引擎优点查询效率是最高的

MEMORY存储引擎缺点不安全,关机之后数据消失,因为数据和索引都是在内存当中


引入事务:

一个事务其实就是一个完整的业务逻辑,它是一个最小的工作单元,是不可再分的。


那么什么是一个完整的业务逻辑呢?


拿现实生活中的银行业务举例,假设转账,从A账户向B账户中转账10000,将A账户的钱减去10000(update语句),将B账户的钱加10000(update语句),这两步操作结合即为一个完整的业务逻辑。


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


只有DML语句[insert,delete,update]才会有事务,其他语句和事务无关


事务机制

当业务只需要一条DML语句就能完成,那么事务就没有存在的价值了,因为正是做某件事时,需要多条DML语句结合才能够完成,才需要事务的存在,事务本质就是多条DML语句同时执行,或者同时失败

事务机制的执行过程:

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

事务开启:

insert
insert
insert
delete
update
update

事务结束!

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

提交事务:

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

回滚事务:

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

自动提交机制:

提交事务:commit;
回滚事务:rollback;[回滚永远都是只能回滚到上一次的提交点]

经过如下测试:

我们得出,MySQL默认情况下是自动提交事务的,即为每执行一条DML语句,则提交一次

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

关闭自动提交机制:

执行下述语句;

start transaction;

人为提交事务:

事务的4个特性:

A:原子性

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

C:一致性

所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性

I:隔离性

A事务和B事务具有一定的隔离

教室A和教室B之间有一道墙,所谓个隔离性就是指这道墙,A事务在操作一张表的时候,另一个事务B也操作这张表,相当于多线程并发访问同一张表


而A教室和B教室之间所隔的墙,可以很厚,也可以很薄,这就是事务的隔离级别,这道墙越厚,表示隔离级别越高


事务和事务之间的隔离级别有哪些?


读未提交:

read uncommitted(最低的隔离级别),事务A可以读取到事务B未提交的数据,这种隔离级别存在的问题就是:脏读现象(Dirty Read),即为读到了脏数据,这种隔离级别一般都是理论上的,大多数的数据库隔离级别第二档起步


验证
查看当前MySQL使用的隔离级别:

8.0以下版本使用该命令:

select @@tx_isolation;

设置隔离级别为read uncommitted

执行下述命令:

set global transaction isolation level read uncommitted;
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
28天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
95 22
 MySQL秘籍之索引与查询优化实战指南
|
8天前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
|
28天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
11天前
|
存储 关系型数据库 MySQL
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
|
2月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
30天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
99 10
|
2月前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
2月前
|
存储 关系型数据库 MySQL
MySQL(条件约束)
为了校验数据,让数据的正确性能够得到保证,约束,能够引进更多的检查操作,但是也会增加系统的成本开销
|
8天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
12天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
116 0