一篇文章进阶MySQL数据库

一,MySQL数据库体系结构

MySQL体系结构

层级说明
连接层主要完成一些类似于连接处理,授权认证,及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限
服务层完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程,函数等
引擎层存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不通的存储引擎有不同的功能,可以根据需要,选取合适的存储引擎
存储层将数据存储在文件系统上,并完成与存储引擎的交互

二,MySQL系统数据库

系统数据库作用
information_schema提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等
mysql存储MySQL服务器正常运行所需要的各种信息(例如时区,主从,用户,权限等)
performance_schema为MySQL服务器运行时提供了一个底层监控功能,主要用于收集数据库服务器性能参数
sys包含了一系列方便DBA和开发人员利用performance_schema性能数据库进行性能调优和诊断的视图

三,存储引擎

存储引擎就是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型

-- 查看数据库支持的存储引擎
SHOW ENGINES;
InnoDBMyISAMMemory
描述是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎是MySQL早期的默认存储引擎不支持事务。支持表锁。访问速度快
特点DML操作遵循ACID模型,支持事务。行级锁。支持外键约束不支持事务。支持表锁。访问速度快内存存放,支持hash索引
文件InnoDB引擎的每张表都会对应一个xxx.ibd表空间文件,存储该表的表结构,数据和索引.MYD文件存放数据。.MYI文件存放索引。 .sdi文件存放表结构的信息.sdi文件存储表结构信息
适用场景对事务的完整性有比较高的要求,在并发条件下要求数据的一致性。数据操作除了插入外,好包含很多的更新和删除操作以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高临时表或缓存

四,索引

索引(Index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。索引提高了数据查询和排序效率,但是索引需占用更多存储空间,降低了表更新的速度

-- 创建索引
CREATE [UNIQUE|FULLTEXT] INDEX 索引名称 ON 表名(字段1,... ...);
-- 查看索引
SHOW INDEX FROM 表名;
-- 删除索引
DROP INDEX 索引名称 ON 表名;

1.MySQL索引结构

MySQL索引是在存储引擎层实现的,不同的存储引擎支持不同的索引结构

结构描述InnoDBMyISAMMemory
B+Tree索引最常见的索引结构,大部分引擎都支持B+树索引支持支持支持
Hash索引底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询不支持不支持支持
R-tree(空间索引)空间索引是MyISAM引擎的一个特殊索引,主要用于地理空间数据类型不支持支持不支持
Full-text(全文索引)是一种通过建立倒排索引匹配文档的方式5.6版本之后支持支持不支持

2.MySQL索引分类

分类含义特点关键字
主键索引针对表中主键创建的索引默认自动创建,只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引查找的是文本中的关键字,而不是比较索引中的值可以有多个FULLTEXT

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种

分类含义特点
聚集索引(Clustered Index)将数据存储和索引放到一起,索引结构的叶子结点保存了行数据只有一个,如果存在主键,主键索引就是聚集索引,如果不存在主键,将使用第一个唯一索引作为聚集索引,如果没有主键也没有唯一索引,InnoDB会自动生成一个rowid作为隐藏的聚集索引
二级索引(Secondary Index)将数据和索引分开存储,索引结构的叶子结点关联的是对应的主键可以存在多个

五,视图

1.视图定义

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询和使用的表,并且是在使用视图是动态生成的。即视图只保存了查询的SQL逻辑,不保存查询结果
要使视图可进行更新操作,视图的行与基础表中的行之间必须存在一对一的关系。如果视图包含聚合函数、窗口函数、DISTINCT、GROUP BY、HANVING、UNION、UNION ALL则视图不可更新

-- 创建视图
CREATE [OR REPLACE] VIEW 视图名称[(列表名称)] AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION]
-- 查看创建视图的SQL语句
SHOW CREATE VIEW 视图名称;
-- 查看视图数据
SELECT * FROM 视图名称...;
-- 修改视图
ALTER VIEW 视图名称[(列表名称)] AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION]
-- 删除视图
DROP VIEW [IF EXISTS] 视图名称[, 视图名称, ...]

2.检查选项

使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图。

检查选项作用
CASCADED检查本视图及依赖视图中的规则以保持一致性
LOCAL仅检查本视图的规则以保持一致性

六,存储过程(Stored Procedure)

存储过程是数据库管理系统中的一组预编译的SQL语句和可编程流程控制结构的集合。它存储在数据库中,可以通过指定名称并提供参数(如果需要的话)来调用执行

-- 创建存储过程
CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
	-- SQL语句
END;
-- 调用存储过程
CALL 存储过程名称([参数列表]);
-- 查看某个存储过程的定义
SHOW CREATE PROCEDURE 存储过程名称;
-- 查看指定数据库的存储过程及状态信息
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='数据库名称';
-- 删除存储过程
DROP PROCEDURE [IF EXISTS] 存储过程名称;

注:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符

优点描述
提高性能存储过程在创建时即被编译,并以编译后的形式存储在数据库中。当存储过程被调用时,不需要再次编译,这可以显著减少网络流量和处理时间,提高应用程序的整体性能
减少网络流量通过将多个SQL操作封装到一个存储过程中,可以减少客户端与服务器之间的通信次数,从而降低网络负载
促进代码重用存储过程可以被多个应用程序或不同的用户重复使用,避免了代码冗余,提高了开发效率
简化复杂的操作对于一些复杂的数据处理任务,如多表更新、事务处理等,可以编写存储过程来完成,使这些操作更加简单易懂
增强安全性可以对存储过程设置权限,使得用户只能通过存储过程访问数据,而不能直接访问底层表。这样既保护了数据的安全性,也便于实现更细粒度的数据访问控制

七,触发器

触发器是与表有关的数据库对象,在insert/update/delete操作的前后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助在数据库端确保数据的完整性,日志记录,数据校验等操作。MySQL数据库提供两个别名OLD和NEW来引用触发器中发生变化的记录内容
MySQL目前只支持行级触发器,不支持语句级触发器

触发器类型NEWOLD
INSERT类型触发器表示将要或者已经新增的数据
UPDATE类型触发器表示将要或已将修改后的数据表示修改之前的数据
DELETE类型触发器表示将要或已经删除的数据
-- 创建触发器
CREATE TRIGGER 触发器名称
BEFORE/AFTER INSERT/UPDATE/DELETE
ON 表名 FOR EACH ROW
BEGIN
	...
END;
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER [schema.name.]触发器名称;

八,锁

MySQL中的锁按照锁的粒度划分

分类描述
全局锁锁定数据库中所有表
表级锁每次操作锁住整张表
行级别锁每次操作锁住对应的行数据

1.全局锁

全局锁就是对整个数据库实例加锁,加锁后整个数据库实例就处于只读状态,后续的DML语句的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞

-- 加全局锁
FLUSH TABLES WITH READ LOCK;
-- 解锁
UNLOCK TABLES;

2.表级锁

每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低,应用在MyISAM,InnoDB,BDB等存储引擎中。表级锁分类如下

(1)表锁

分类描述
表共享读锁(read lock)本连接只能进行读操作不能进行写操作,其他连接只能进行读操作,写操作将会阻塞
表独占写锁(write lock)本连接能进行读和写操作,其他连接的读和写操作将会阻塞
-- 加锁
LOCK TABLES 表名1, 表名2, ... READ/WRITE;
-- 解锁(注:关闭客户端连接也能达到解锁的效果)
UNLOCK TABLES;

(2)元数据锁 (meta data lock,MDL)

元数据锁的加锁过程是数据库自动控制的,无需显式使用,在访问一张表的时候会自动加上。主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写操作,为了避免DDL和DML冲突,保证读写的正确性。当对一张表进行DML操作的时候,加MDL共享读锁,进行DDL操作的时候,加MDL排他写锁。元数据锁的加锁时机如下

对应SQL锁类型说明
LOCK TABLES 表名1, 表名2, … READ/WRITESHARED_READ_ONLY/SHARED_NO_READ_WRITE
SELECT、SELECT … LOCK IN SHARE MODESHARED_READ与SHARED_READ和SHARED_WRITE兼容,与EXECLUSIVE互斥
INSERT、UPDATE、DELETE、SELECT … FOR UPDATESHARED_WRITE与SHARED_READ和SHARED_WRITE兼容,与EXECLUSIVE互斥
ALTER TABLE …EXECLUSIVE与其他MDL都互斥
SELECT object_type, object_schema, object_name, lock_type, lock_duration FROM performance_schema.metadata_locks;

(3)意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB引擎中引入了意向锁,使得表锁不用检查每行数据是否加锁,使得意向锁来减少表锁的检查

分类兼容
意向共享锁(IS)与表共享读锁兼容,与表独占写锁互斥
意向排他锁(IX)与表共享读锁和表独占写锁互斥

意向锁之间不会互斥,意向锁会在加行锁时自动加上

3.行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率低,并发度最高,应用在InnoDB引擎中
InnoDB的行锁是针对索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁

-- 查看意向锁及行级锁的加锁情况
SELECT object_schema, object_name, index_name, lock_type, lock_mode, lock_data FROM performance_schema.data_locks;

(1)行锁的模式

模式描述
行锁(Record Lock)锁定单个行记录的锁,防止其他事务对此进行update和delete。在RC和RR隔离级别下都支持
间隙锁(Gap Lock)锁定索引的记录间隙(不包含记录),确保索引记录间隙不变,防止其他事务在这个间隙进行插入操作,产生幻读。在RR隔离级别下支持
临键锁(Next-Key Lock)行锁和间隙锁组合,同时锁住数据和数据前面的间隙,在RR隔离级别下支持

间隙锁唯一的目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一个间隙上采用间隙锁

默认情况下,InnoDB在RR事务隔离级别运行,InnoDB会使用临键锁(Next-Key Lock)进行搜索和引擎扫描,以防幻读
唯一索引上的等值匹配,对已存在的记录加锁时,将会自动优化为行锁
唯一索引上的等值匹配,对不存在的记录加锁时,将会自动优化为间隙锁
普通索引的等值匹配,向右遍历时最后一个值不满足查询需求时,临键锁退化为间隙锁

(2)行锁的分类

InnoDB实现了以下两种类型的行锁

分类说明
共享锁(S)允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。即与共享锁兼容,与排他锁互斥
排他锁(X)允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。即排斥共享锁和排他锁

(3)行锁的加锁时机

SQL行锁类型说明
INSERT …排他锁自动加锁
UPDATE …排他锁自动加锁
DELETE …排他锁自动加锁
SELECT …不加任何锁
SELECT … LOCK IN SHARE MODE共享锁需要手动在SELECT之后加LOCK IN SHARE MODE
SELECT … FOR UPDATE排他锁需要手动在SELECT之后加FOR UPDATE

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 Pake 一键打包网页为桌面应用 / 客户端

项目 项目:https://github.com/tw93/Pake/ 免费ICO图片:https://icon-icons.com/zh/ 设置环境 以下教程仅针对windows系统适用 请确保您的 Node.js 版本为 18 或更高版本 文档:https://v1.tauri.app/zh-cn/v1/guides/getting-started/prerequ…

java小游戏实战-星空大战(接口、继承、多态等多种方法)

环境:Windows系统Eclipse/idea、jdk8 1.创建英雄类 2.创建飞机类 3.创建敌人接口 package com.plane;public interface Enemy { /* *得分的方法 */ public int getScore(); } 4.创建小蜜蜂类 5.创建奖励接口 package com.plane;public interface Award {public …

【Linux笔记】Linux命令与使用

博文将不断学习补充 学习参考博文: Linux命令大全:掌握常用命令,轻松使用Linux操作系统-CSDN博客 文件或目录操作命令 zip # zip是使用最多的文档压缩格式 # 方便跨平台使用,但是压缩率不是很高 zip指令未安装 安装zip yum ins…

深度学习相关知识点

文章目录 epoch/batch/batch_size的关系dense visual predictionlogits epoch/batch/batch_size的关系 Epoch:模型在整个数据集上完成一次训练。一个epoch后,模型已经看过所有的训练数据,执行了正向传播和反向传播。通常训练需要多个epoch&a…

【C#】搭建环境之CSharp+OpenCV

在我们使用C#编程中,对图片处理时会用到OpenCV库,以及其他视觉厂商提供的封装库,这里因为OpenCV是开源库,所以在VS资源里可以直接安装使用,这里简单说明一下搭建的步骤及实现效果,留存。 1. 项目创建 1.1…

055_基于python摄影平台交流系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

【笔试题】字节秋招笔试 TODO

🔗 参考地址 亮灭 🔗 亮灭 🎉 模拟 import java.util.Scanner;public class Main {// 亮灯数组:a[1][2][3] 表示 数字1的第2行第3列,1 表示亮static int[][][] a new int[10][10][10];public static void main(Str…

python机器人编程——用python调用API控制wifi小车的实例程序

目录 一、前言二、一个客户端的简单实现2.1 首先定义一个类及属性2.2 其次定义连接方法2.3 定义一些回调函数2.4 定义发送小车指令方法2.5 定义一个正常关闭方法 三、python编程控制小车的demo实现四、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源p…

从0开始linux(19)——如何写一个linux环境下运行的shell程序

欢迎来到博主的专栏:从0开始Linux 博主ID:代码小豪 文章目录 bashmyshell源码 bash 什么?我写bash?bash作为一个大型的shell程序,甚至已经成为一种语言。博主当然没能力复刻。 博主这里写了一个仿bash的shell程序。主…

Linux:文件系统基础命令扫盲

目录 查看目录下的文件 创建目录文件 删除目录文件 打印当前工作目录 切换工作目录 删除文件 复制文件或目录 移动文件或目录 创建文件 🚀主页:R6bandito_ ✈往期:《Linux与Windows文件共享》 查看目录下的文件 命令:ls …

2024年【流动式起重机司机】考试技巧及流动式起重机司机模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 流动式起重机司机考试技巧是安全生产模拟考试一点通生成的,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材汇编出流动式起重机司机仿真模拟考试。2024年【流动式起重机司机】考试技巧及…

正确的功能可将热晶体管风速计线性化

处理传感器电路输出信号的电路或计算公式必须生成传感器响应的反函数。例如,如果传感器响应是对数函数,则线性化部分的响应必须是指数的。 这项工作首先获取传感器响应的 46 个离散点(参见参考论文中的图 4)。刚开始时&#xff0…

若依前后分离版集成积木报表进行token传递

若依分离板集成积木报表就不说了需要的请移步:若依前后分离版集成积木报表-CSDN博客 考虑到前端摸鱼不干活,所以一般都是前后端都干,我这里前后端都搞上,你们直接抄,抄完接着去摸鱼,代码不美观,轻喷 一、…

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作:通过实验操作与学习,熟练掌握ArcGIS软件相关的基本操作,包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪:通过实验操作与学习&am…

ABAP SMARTFORMS(2)

1、表单接口 方法一:导入结构、内表,给全局定义传入结构体 方法二:只关联表,不关联结构,给全局定义传入结构体 GW_XYXX存的表头信息 GW_XYKQ存考勤信息,表中的每一行 初始化学员信息表的第一条数据作为表头 2、创建表头模板 该…

x-cmd mod | x sd - 搭配 fzf 实时预览文本替换效果,打造更直观高效的编辑体验

目录 介绍子命令使用案例 介绍 sd(search & displace)是一种查找和替换文本工具,使用常见的正则表达式语法,类似于 sed,但专注于替换操作,从而使用起来更直观、更易读。 该模块主要通过 fzf 以交互方式…

单片机STC8H8K64U开发板_RA6809开发板 驱动彩屏显示

单片机STC8H8K64U开发板,型号RT8H8K001 预留Type C接口,可供电SWD下载: RA6809开发板,型号RT6809CNN01 预留Type C接口供电,预留MCU接口、电容触摸屏接口、液晶屏接口: 双臂合一,驱动和控…

Error in cpuinfo: prctl(PR_SVE_GET_VL) failed 错误记录

今天在一台新机器上面搭建安装环境的时候出现了上面的错误,直观感觉是跟py-cpuinfo这个模块有关系的。 Error in cpuinfo: prctl(PR_SVE_GET_VL) failed 错误通常与 ARM 架构上的 CPU 信息库(如 cpuinfo)相关,特别是在尝试获取可扩…

web pdf 图片拖动图片合成

web pdf 图片拖动图片合成 先看效果 前端 合成后 1.原理 以前写过相关的帖子,使用的是 canva 但是这次换了一个思路使用的是图片 1.先把pdf转成图片 2.把pdf图片和目标图片传到浏览器 3.原理就和图片合成一样了。见上一篇帖子 4.后端也一样只不过这次是将位置和pd…

IntelliJ IDEA 常用快捷键详解与自定义修改方法

目录 前言1. IntelliJ IDEA 常用快捷键1.1 代码编辑快捷键1.2 代码导航快捷键1.3 重构快捷键1.4 调试快捷键 2. 如何修改 IntelliJ IDEA 快捷键2.1 打开快捷键设置界面2.2 查找和修改快捷键2.3 导入和导出快捷键配置 结语 前言 IntelliJ IDEA 是一款广受开发者欢迎的集成开发环…