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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,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
目录
打赏
0
0
0
0
5
分享
相关文章
MySQL底层概述—9.ACID与事务
本文介绍了数据库事务的ACID特性(原子性、一致性、隔离性、持久性),以及事务控制的演进过程,包括排队、排它锁、读写锁和MVCC(多版本并发控制)。文章详细解释了每个特性的含义及其在MySQL中的实现方式,并探讨了事务隔离级别的类型及其实现机制。重点内容包括:ACID特性(原子性、持久性、隔离性和一致性的定义及其实现方式)、事务控制演进(从简单的全局排队到复杂的MVCC,逐步提升并发性能)、MVCC机制(通过undo log多版本链和Read View实现高效并发控制)、事务隔离级别(析了四种隔离级别(读未提交、读已提交、可重复读、可串行化)的特点及适用场景)、隔离级别与锁的关系。
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
118 22
 MySQL秘籍之索引与查询优化实战指南
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
153 31
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
101 42
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
54 25
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等