Mysql概述

关系型数据库-Mysql

为什么采用关系型数据库?

  • 易理解

    对于结构化数据(严格遵循数据格式与长度规范),关系型数据库的二维表结构完美契合,非常贴近现实世界,简单直观,容易理解,如下图。

    img

  • 操作方便

    因为其二维表结构,格式统一,所以使得设计出的SQL语言操作关系型数据库非常方便。

  • 数据一致性

    因为二维表结构,当多表相关联,容易实现其一致性。

  • 数据文档

    数据持久化到磁盘,没有丢失数据风险,支持海量数据存储

Mysql管理系统

Mysql管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控
制。用户通过数据库管理系统访问数据库中表内的数据(数据库则是有组织的数据。)。

image-20220623151530515

服务器通过TCP连接Mysql服务器,发送相关命令给Mysql服务器(管理系统)来操作数据库。

Mysql逻辑架构

下面就是 MySQL 执行一条 SQL 查询语句的流程,以此来分析MySQL内部逻辑架构

image-20220623152246905

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

创建表

语法格式

image-20220623224347331

常用数据类型

image-20220623224553234

约束

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

为什么要约束?

目的:保证数据库中数据的正确、有效性和完整性。

有哪些约束?

image-20220623231446318

实例

image-20220623224702435

SQL基础操作语句 (来了解应用层会有哪些需求)

DDL (数据定义语言)

用来定义数据库对象(数据库,表,字段),包括对库和表的创建,修改,删除等操作。

DML(数据操作语言)

用来对数据库中表的数据记录进行增、删、改操作,关键字如下:

  • 添加数据(INSERT)
  • 修改数据(UPDATE)
  • 删除数据(DELETE)

DQL(数据查询语言)

用来查询数据库中表的记录。

查询关键字: SELECT

  • 简单按段查询

  • 条件查询(对返回结果集进行过滤)(where关键字)

  • 通配符过滤

  • 正则表达式过滤

  • 分组查询(按某段或多段的记录按不同组合进行分组(分类))

  • 排序查询

  • 连接查询(跨表查询)

  • 嵌套查询(嵌套了表查询)

  • 聚合函数 (按段处理,或多段处理)

    针对检索到的进行聚合操作,如求和,排序

DCL(数据控制语言)

用来管理数据库用户、控制数据库的访问权限。

内置数据处理函数(针对检索到的每条记录进行操作)

  • 字符串函数
  • 数值函数
  • 日期函数
  • 流程函数
posted @ 2022-06-23 23:28  xfw121  阅读(183)  评论(0)    收藏  举报