Mysql概述
关系型数据库-Mysql
为什么采用关系型数据库?
-
易理解
对于结构化数据(严格遵循数据格式与长度规范),关系型数据库的二维表结构完美契合,非常贴近现实世界,简单直观,容易理解,如下图。
![img]()
-
操作方便
因为其二维表结构,格式统一,所以使得设计出的SQL语言操作关系型数据库非常方便。
-
数据一致性
因为二维表结构,当多表相关联,容易实现其一致性。
-
数据文档
数据持久化到磁盘,没有丢失数据风险,支持海量数据存储
Mysql管理系统
Mysql管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控
制。用户通过数据库管理系统访问数据库中表内的数据(数据库则是有组织的数据。)。

服务器通过TCP连接Mysql服务器,发送相关命令给Mysql服务器(管理系统)来操作数据库。
Mysql逻辑架构
下面就是 MySQL 执行一条 SQL 查询语句的流程,以此来分析MySQL内部逻辑架构

MySQL 的架构共分为两层:Server 层和存储引擎层
Server 层
Server 层负责与客户端建立连接、对SQL分析和执行 (调用与存储引擎提供的API)。
-
连接器
- 与客户端进行 TCP 三次握手建立连接;
- 校验客户端的用户名和密码,如果用户名或密码不对,则会报错;
- 如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;
-
查询缓存
缓存SQL查询结果,对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作,那么这个表的查询缓存就会被清空。
-
解析 SQL
-
词法分析
MySQL 会根据你输入的字符串识别出关键字出来,构建出 SQL 语法树,这样方面后面模块获取 SQL类型、表名、字段名、 where条件等等
-
语法分析
根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。
-
-
执行 SQL
-
预处理器
检查 SQL 查询语句中的表或者字段是否存在;
将 select * 中的 * 符号,扩展为表上的所有列;
-
优化器
优化器主要负责将 SQL 查询语句的执行方案确定下来,优化器并不关心表使用的是什么存储引擎,但存储引擎对于优化查询是有影响的。优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。例如,某些存储引擎的某种索引,可能对一些特定的查询有优化。关于索引与schema的优化,请参见第4章和第5章。
-
执行器
执行器通过存储引擎提供的API与之交互,交互是以记录为单位的。
-
主键索引查询
存储引擎通过主键索引的 B+ 树结构定位到 id =xxx 的第一条记录,如果记录是不存在的,就会向执行器上报记录找不到的错误,然后查询结束。如果记录是存在的,就会将记录返回给执行器;执行器从存储引擎读到记录后,接着判断记录是否符合查询条件,如果符合则发送给客户端,如果不符合则跳过该记录。
-
全表扫描(不用索引)
循环读直到全表遍历完,如果读到满足条件,就返回给客户端。
-
索引下推(mysql执行器的一些操作交给存储引擎来做,减少回表操作)
-
-
存储引擎
存储引擎层负责数据的存储和提取
-
支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。
-
服务器通过API与存储引擎进行通信。
这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎API包含几十个底层函数,用于执行诸如“开始一个事务”或者“根据主键提取一行记录”等操作。但存储引擎不会去解析SQL*",不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。
-
事务
事务就是满足满足ACID的特性的一组原子性的SQL查询。
-
原子性
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
-
一致性
事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
-
隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力。
-
-
并发控制-锁
无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。通过可以加锁来解决该问题,在 MySQL 里,根据加锁的范围,可以分为全局锁、表级锁和行锁三类。
数据库的基本单元-表
E-R(实体-联系)模型中有三个主要概念是: 实体集、属性、联系集。
实体集和属性
一个实体集(class)对应于数据库中的一个表,一个实体则对应于数据库表中的一行,也称为一条记录。一个属性对应于数据库表中的一列,也称为一个字段。

ORM思想 (Object Relational Mapping)体现:
- 数据库中的一个表 <---> Java或Python中的一个类
- 表中的一条数据 <---> 类中的一个对象(或实体)
- 表中的一个列 <----> 类中的一个字段、属性(field)
表的关联关系
为什么需要外键?
使得表的维护更简单,但因为要维护外键,明显会有性能瓶颈问题。
有哪些表关联关系?
表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用
关系模型来表示。四种:一对一关联、一对多关联、多对多关联、自我引用
-
一对一关联(one-to-one)
关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另
一张表中,以提升操作效率。实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
![image-20220623221614460]()
-
一对多
实现: 在多的一方建立外键,指向一的一方的主键
![image-20220623222610117]()
-
多对多
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
![image-20220623222721616]()
-
自我连接
![image-20220623222819089]()
创建表
语法格式

常用数据类型

约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
为什么要约束?
目的:保证数据库中数据的正确、有效性和完整性。
有哪些约束?

实例

SQL基础操作语句 (来了解应用层会有哪些需求)
DDL (数据定义语言)
用来定义数据库对象(数据库,表,字段),包括对库和表的创建,修改,删除等操作。
DML(数据操作语言)
用来对数据库中表的数据记录进行增、删、改操作,关键字如下:
- 添加数据(INSERT)
- 修改数据(UPDATE)
- 删除数据(DELETE)
DQL(数据查询语言)
用来查询数据库中表的记录。
查询关键字: SELECT
-
简单按段查询
-
条件查询(对返回结果集进行过滤)(where关键字)
-
通配符过滤
-
正则表达式过滤
-
分组查询(按某段或多段的记录按不同组合进行分组(分类))
-
排序查询
-
连接查询(跨表查询)
-
嵌套查询(嵌套了表查询)
-
聚合函数 (按段处理,或多段处理)
针对检索到的进行聚合操作,如求和,排序
DCL(数据控制语言)
用来管理数据库用户、控制数据库的访问权限。
内置数据处理函数(针对检索到的每条记录进行操作)
- 字符串函数
- 数值函数
- 日期函数
- 流程函数






浙公网安备 33010602011771号