MySQL概述与体系结构

news2024/11/15 11:43:28

文章目录

  • 一、MySQL概述
    • 1.1 MySQL与redis的区别
    • 1.2 数据处理分类
    • 1.3 SQL
    • 1.4 数据类型
  • 二、数据库设计三范式
    • 2.1 范式一
    • 2.2 范式二
    • 2.3 范式三
    • 2.4 反范式
  • 三、MySQL体系结构
    • 3.1 结构组成
    • 3.2 连接池
  • 四、sql语句执行过程
    • 4.1 select语句
    • 4.2 CRUD执行过程

一、MySQL概述

1.1 MySQL与redis的区别

所谓的数据库,是指按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

之前我们了解了redis,本节开始介绍Mysql。MySQL和Redis是两种不同类型的数据库,它们有以下几个主要区别:

1)数据库类型:MySQL是一种关系型数据库(RDBMS),而Redis是一种非关系型数据库(NoSQL)。关系型数据库使用表格来存储数据,而非关系型数据库使用键值对、文档、列族等方式来组织数据。

2)数据模型:MySQL支持复杂的表结构,可以建立表与表之间的关系,进行复杂的查询操作。而Redis采用简单的键值对模型,数据以键值对的形式存储,并且支持多种数据结构,如字符串、列表、集合、哈希和有序集合等。

3)数据持久化:在默认配置下,MySQL将数据持久化到硬盘上,保证数据的长期存储。而Redis可以选择将数据持久化到磁盘上,或者只保存在内存中,根据不同的需求进行配置。

4)数据访问速度:由于Redis将数据存储在内存中,所以具有非常高的读写性能,适合处理大量的实时请求。而MySQL则需要将数据从磁盘读取到内存中进行操作,相对来说读写速度较Redis略慢。

5)数据库功能:MySQL是一种成熟的关系型数据库系统,支持复杂的查询、事务处理、索引等功能,适用于处理复杂的关系数据。而Redis作为缓存数据库和键值存储系统,更适合处理高速读写、低延迟、数据量较小的场景。

综上所述,MySQL适用于需要复杂查询和事务支持的场景,适合存储结构化数据;而Redis适用于高性能、实时性要求高的场景,适合作为缓存、队列或临时数据存储等使用。

1.2 数据处理分类

1)OLTP(On-Line transaction processing):联机事务处理,主要对数据库增删改查。

OLTP 主要用来记录某类业务事件的发生;数据会以增删改的方式在数据库中进行数据的更新处理操作,要求实时性高、稳定性强、确保数据及时更新成功。

2)OLAP(On-Line Analytical Processing):联机分析处理,主要对数据库查询。

当数据积累到一定的程度,我们需要对过去发生的事情做一个总结分析时,就需要把过去一段时间内产生的数据拿出来进行统计分析,从中获取我们想要的信息,为公司做决策提供支持,这时候就是在做 OLAP 。

1.3 SQL

结构化查询语言(Structured Query Language) 简称 SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL 是关系数据库系统的标准语言。其命令包括:DQL、DML、DDL、DCL以及TCL。

1)DQL(Data Query Language - 数据查询语言)
select :从一个或者多个表中检索特定的记录。

2)DML(Data Manipulate Language - 数据操作语言)
insert :插入记录;
update :更新记录;
delete :删除记录;

3)DDL(Data Define Languge - 数据定义语言)
create :创建一个新的表、表的视图、或者在数据库中的对象;
alter :修改现有的数据库对象,例如修改表的属性或者字段;
drop :删除表、数据库对象或者视图。

4)DCL(Data Control Language - 数据控制语言)
grant :授予用户权限;
revoke :收回用户权限;

5)TCL(Transaction Control Language - 事务控制语言)
commit :事务提交;
rollback :事务回滚

1.4 数据类型

MySQL支持多种数据类型,可以根据需要选择适合的类型。下面是一些常见的MySQL数据类型:

1)数值数据类型:

  • INT:整数类型,占用4字节,范围为-2147483648到2147483647。
  • BIGINT:大整数类型,占用8字节,范围更大,从-9223372036854775808到9223372036854775807。
  • FLOAT(M, D):单精度浮点数,指定总位数M和小数位数D。
  • DOUBLE(M, D):双精度浮点数,指定总位数M和小数位数D。

2)字符串数据类型:

  • CHAR(N):固定长度字符串,最多可存储N个字符,如果字符数不足,将使用空格填充。
  • VARCHAR(N):可变长度字符串,最多可存储N个字符,根据实际字符数分配存储空间。
  • TEXT:用于存储大量文本数据的类型。

3)日期和时间数据类型:

  • DATE:日期类型,格式为’YYYY-MM-DD’。
  • TIME:时间类型,格式为’HH:MM:SS’。
  • DATETIME:日期和时间类型,格式为’YYYY-MM-DD HH:MM:SS’。
  • TIMESTAMP:自动记录插入或修改操作的日期和时间。

4)布尔数据类型:

  • BOOL / BOOLEAN:布尔类型,存储TRUE或FALSE。

5)枚举和集合数据类型:

  • ENUM(‘value1’, ‘value2’, …):枚举类型,存储指定的一个值。
  • SET(‘value1’, ‘value2’, …):集合类型,可以存储多个指定的值。

还有其他一些复杂的数据类型,如二进制数据类型、JSON数据类型等。

二、数据库设计三范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

2.1 范式一

确保每列保持原子性;数据库表中的所有字段都是不可分解的原子值。

例如,表中有一个需要经常访问的地址字段,如果我们设计成:中国浙江省杭州市XXX区XXX号。一般我们分析数据时候,不需要具体地址,只需要知道哪个市哪个区,这个时候需要将该字段拆分,整个操作就很复杂。

2.2 范式二

确保表中的每列都和主键相关,而不能只与主键的某一部分相关(组合索引)。

例如下面这张表的设计,有两个主键:订单编号和商品编号,其中{商品名称、数量、单位、价格}只跟商品编号直接相关,{客户、所属单位、联系方式}跟订单编号直接相关。数据少的时候看不出问题,但如果数据量大,整个表格就会很冗余。
在这里插入图片描述
我们可以拆分成三个表,再根据需要联表查询
在这里插入图片描述

2.3 范式三

确保每列都和主键直接相关,而不是间接相关;减少数据冗余

例如下面这张表的设计,有一个主键:订单编号。其中{客户名称、所属公司、联系方式}与客户编号直接相关,但与订单编号间接相关。
在这里插入图片描述
我们可以拆分成两个表
在这里插入图片描述

2.4 反范式

范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦;但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低;因此处于性能考虑,可能需要进行反范式设计。

比如用户user表,需要存储很多个人信息,有很多字段确实不符合三范式。比如地址、单位、性别、年龄。但如果都分开,那是很多张表,造成更多的联表查询。

三、MySQL体系结构

3.1 结构组成

MySQL 由以下几部分组成:
1)连接者
不同语言的代码程序和 MySQL 的交互(SQL交互)

2)连接池
管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求

3)管理服务和工具组件
系统管理和控制工具,例如备份恢复、MySQL 复制、集群等;

4)SQL接口
将 SQL 语句解析生成相应对象;DML,DDL,存储过程,视图,触发器等

5)查询解析器
将 SQL 对象交由解析器验证和解析,并生成语法树

6)查询优化器
SQL 语句执行前使用查询优化器进行优化

7)缓冲组件
是一块内存区域,缓存最近操作的数据,用来弥补磁盘速度较慢对数据库性能的影响

8)插件式存储引擎

9)物理文件
在这里插入图片描述

3.2 连接池

MySQL连接池用于管理连接,校验用户信息等。MySQL命令是并发处理的

  • 网络处理流程:主线程接收连接,接收连接交由连接池处理
  • 主要处理方式:IO多路复用 select + 阻塞的 io

之所以用select 是因为select 是跨平台的IO多路复用。

MySQL命令是并发处理的,主线程负责接收客户端连接,然后为每个客户端 fd 分配一个连接线程,负责处理该客户端的 sql 命令处理。
在这里插入图片描述

四、sql语句执行过程

4.1 select语句

在这里插入图片描述

4.2 CRUD执行过程

CRUD操作,即创建(Create)、读取(Read)、更新(Update)和删除(Delete)
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复现沙箱逃逸漏洞

什么是沙箱(sandbox) 在计算机安全性方面,沙箱(沙盒、sanbox)是分离运行程序的安全机制,提供一个隔离环境以运行程序。通常情况下,在沙箱环境下运行的程序访问计算机资源会受到限制或者禁止,资源包括内存、…

小白到运维工程师自学之路 第六十四集 (dockerfile构建tomcat、mysql、lnmp、redis镜像)

一、tomcat&#xff08;更换jdk&#xff09; mkdir tomcat cd tomcat/ tar xf jdk-8u191-linux-x64.tar.gz tar xf apache-tomcat-8.5.40.tar.gzvim Dockerfile FROM centos:7 MAINTAINER Crushlinux <syh163.com> ADD jdk1.8.0_191 /usr/local/java ENV JAVA_HOME /us…

使用Canvas裁剪图片

使用Canvas裁剪图片 概述 在Web开发中&#xff0c;我们经常需要对图片进行裁剪&#xff0c;以满足不同尺寸需求或者实现图片的局部展示。本篇博客将带您深入了解如何使用Canvas技术来实现图片的裁剪功能。我们将通过一个实例来演示如何利用Canvas绘制图片&#xff0c;并通过蒙…

二叉树的相关题目

目录 1、根据二叉树创建字符串 2、二叉树的层序遍历 3、二叉树的最近公共祖先 4、搜索二叉树与双向链表 5、从前序与中序遍历序列构造二叉树 6、 从中序与后序遍历序列构造二叉树 7、二叉树的前序遍历&#xff08;非递归实现&#xff09; 8、二叉树的中序遍历&#xff08…

宋浩高等数学笔记(十)重积分

本章更新第10章重积分&#xff0c;关于三重积分的应用部分暂时略过&#xff0c;本部分在考察的时候不会很难&#xff0c;困难在于对重积分本质的理解&#xff0c;以及极坐标下相关公式的计算。类比普通的定积分&#xff0c;如果对一个宽度不均匀的函数&#xff0c;求积分分后相…

工厂模式详解与应用场景

摘要&#xff1a; 工厂模式是一种常见的设计模式&#xff0c;它可以帮助我们在面向对象的程序设计中更好地组织和管理对象的创建过程。本文将详细介绍工厂模式的概念、三种常见的工厂模式应用场景&#xff0c;并提供高质量的C代码示例&#xff0c;旨在帮助初学者更好地理解和应…

【Spring Boot系列】-Spring Boot过滤器Filter

【Spring Boot系列】-Spring Boot过滤器Filter 文章目录 【Spring Boot系列】-Spring Boot过滤器Filter一、概述二、Filter&#xff08;过滤器&#xff09;数据流程三、Spring Boot 过滤器生命周期四、使用注解方式实现过滤器(WebFilter)4.1. 在springboot 启动类添加该注解Ser…

JAVA大神必备,IDEA自带的JVM监控神器

前言 开发阶段实时监测&#xff0c;自己的JVM信息&#xff0c;实时可视化 Hotspot JVM 垃圾回收监控工具, 支持查看本地和远程JVM进程, 支持G1 and ZGC算法。 插件安装 在线安装 IntelliJ IDEA 可通过在线安装的方式&#xff0c;安装插件 JDK VisualGC&#xff0c;安装步骤: …

过程:从虚拟机上添加 git 并成功提交到 GitLab 的全过程

Ⅰ、准备工作&#xff1a; 1、Git 查看&#xff1a; 其一、命令&#xff1a;git --version // 此时就能在虚拟机环境下看到 git 的版本为: git version 2.41.0 其二、如何在虚拟机上安装 git &#xff1a; A、命令 &#xff1a; sudo apt-get install git B、然后再输入虚…

JavaScript |(三)内建对象 | 数组 | string对象 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 &#x1f4da;数组&#x1f407;数组介绍⭐️数组&#xff08;Array&#xff09;⭐️基本操作⭐️数组的字面量 &#x1f407;数组中的常用方法⭐️push()⭐️pop()⭐️unshift()⭐️shif…

微信小程序wx.getlocation接口权限申请总结

先附上申请通过截图 插播内容&#xff1a;可代开通&#xff0c;保证通过。wx.getLocation接口&#xff08;获取当前的地址位置&#xff09; qq&#xff1a; 308205428 如何申请 当申请微信小程序的wx.getLocation接口权限时&#xff0c;你可以…

yolov8-制作数据集,数据集格式转换(yolo格式-voc格式)附完整代码

yolo训练时可使用的数据集格式为yolo格式以及voc格式&#xff0c; voc格式的数据集在训练时需要先转换为yolo格式&#xff0c;然后根据自己的数据集的位置更改yaml配置文件的文件路径即可。基于目前对Yolo系列训练模型的讲解已经很全面&#xff0c;所以本文主要讲解yolo数据集与…

记录 FreeRTOS 信号量 的简单用法

FreeRTOS 信号量 最简单的应用场景是 两个任务间的同步 &#xff0c;这里以 二值信号量 Binary Semaphore为例 用法 &#xff1a; 1&#xff0c;定义与 创建 /* Definitions for myBinarySem01 */ osSemaphoreId_t myBinarySem01Handle; const osSemaphoreAttr_t myBinarySe…

c++类与对象详解

c类与对象详解 对象类方法自定义类型类的特性this类的六个默认成员函数static成员友元内部类 对象 在C中&#xff0c;对象是类的实例。定义对象的语法为&#xff1a; <class_name> object_name;其中&#xff0c;class_name 是定义类时指定的类名&#xff0c;object_nam…

二分查找【Java算法】

文章目录 1. 概念2. 思路3. 代码实现 1. 概念 二分查找又叫折半查找&#xff0c;要求待查找的序列有序&#xff0c;每次取中间位置的值与待查关键字比较&#xff0c;如果待查关键字比中间位置的值小&#xff0c;则在前半部分循环这个查找的过程&#xff0c;反之&#xff0c;在后…

7_分类算法—逻辑回归

文章目录 逻辑回归&#xff1a;1 Logistic回归&#xff08;二分类问题&#xff09;1.1 sigmoid函数1.2 Logistic回归及似然函数&#xff08;求解&#xff09;1.3 θ参数求解1.4 Logistic回归损失函数1.5 LogisticRegression总结 2 Softmax回归&#xff08;多分类问题&#xff0…

单元测试之 - Review一个微服务的单元测试

这里以github上一个microservice的demo代码为例&#xff0c;来看看如何为一个完整的服务编写单元测试。具体代码如下所示&#xff0c;我们重点查看一下catalog和customer&#xff0c;order中的单元测试有哪些。 首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWe…

时序数据异常检测算法

引言 异常检测的场景很多&#xff0c;例如&#xff1a;硬件的故障检测、流量的异常点的检测等场景。针对时间序列类数据的异常检测算法也有很多&#xff0c;业界比较流行的比如普通的统计学习方法–3σ原则和箱线图识别数据离群点&#xff0c;它利用检测点偏移量来检测出异常。…

Michael.W基于Foundry精读Openzeppelin第19期——EnumerableSet.sol

Michael.W基于Foundry精读Openzeppelin第19期——EnumerableSet.sol 0. 版本0.1 EnumerableSet.sol 1. 目标合约2. 代码精读2.1 结构体Set2.1.1 _contains(Set storage set, bytes32 value) && _length(Set storage set) && _at(Set storage set, uint256 inde…

Linux的基本指令(2)

指令1&#xff1a;man 作用&#xff1a;可以查询linux指令语法内容。 格式&#xff1a; man 指令 安装man指令&#xff1a; yum install -y man-pages 例如&#xff1a; 查询 指令 ls 的语法内容。 man ls 查询 fork 指令的语法内容。 man fork 在man中存在9个手册&…