MySQL-基础汇总

news2024/11/23 23:55:45

MySQL-基础汇总

数据库对于任何一个从事后台开发的人说都是永远躲不掉的,任何系统或程序离开了数据的支持都变的毫无意义。而管理数据的工具——数据库就显得尤为重要。本章节我们的核心就是 MySQL,相信很多小伙伴跟我一样,也沉浸在增、删、改、查的舒适区里沾沾自喜。认为MySQL也不过如此,这不用起来也得心应手的嘛!而当你真正走出这个舒适圈,看看外面的世界(与他人技术交流亦或求职面试)。猛然发现自己真的是井底之蛙,有些概念或许听说过,有些甚至不知所云。所以有必要认真系统的去学习并整理一下 MySQL。

SQL的执行流程

众所周知,我们对 MySQL 数据库中数据的操作是通过执行 sql 语句来实现的。那么一个 sql 语句的执行中间经历了怎样的过程?

建立连接

无论我们的 sql 语句写的再天花乱坠,没有连上 MySQL 就是白费功夫。所以第一步得需要跟 MySQL数据库建立连接,客户端向 MySQL 数据库发送网络请求(TCP/IP、命名管道或共享内存、Unix域套接字这几种方式之一来与服务器进程建立连接。这几种连接方式了解下即可),每当有一个客户端进程连接到 MySQL 时,MySQL 都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与MySQL 断开连接,MySQL 并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,为了节省线程销毁和创建的开销,把这个缓存的线程分配给这个新连接的客户端。那怎么知道相关线程的连接情况呢?(注:本文所有的命令执行都是通过Navicat执行的)

我们可以通过执行命令

show status like 'Threads%';

执行结果如下
在这里插入图片描述

  1. Threads_cached:表示线程缓存中的线程数量。MySQL会缓存一定数量的线程以应对新的连接请求,这样可以避免为每个新连接都创建和销毁线程的开销。如果这个数字接近Threads_connected,那么说明线程缓存设置得比较合适。设置缓存大小的配置是thread_cache_size 默认大小为-1 可自动调整。它的最大值是16384。
  2. Threads_connected:当前打开的连接数。这个数字显示了有多少客户端正在与MySQL服务器进行交互。
  3. Threads_created:自服务器启动以来创建的线程总数。如果这个值越大,配置项 thread_cache_size 可相应的增大以提升线程的缓存命中率
  4. Threads_running:当前正在执行查询(运行)的线程数量。

这里提到了 thread_cache_size 我们可以通过命令进行查看

SELECT @@thread_cache_size

执行结果如下
在这里插入图片描述

-- 显示用户正在运行的线程
show FULL PROCESSLIST 

关于连接其实还有一个需要关注的点——连接数,那要查看最大连接数我们可以通过执行

SELECT @@max_connections

执行结果如下
在这里插入图片描述

max_connections 表示最大的连接数,超过该值不允许建立连接 。 默认值是151,最小值是1最大值是‌100000。

想要查看连接超时时间可以通过执行命令

SELECT @@wait_timeout;

在这里插入图片描述

wait_timeout 非交互连接等待的时间 (单位s) 默认值28800 也就是8小 时,空闲的线程如果8小时没动静,则会断开。

在其他的连接的配置中比较重要的就是 Max_used_connections,查看与之相关的信息可以通过执行命令

show status like 'Max_used_connections%';

执行结果如下
在这里插入图片描述

Max_used_connections 自服务启动以来最大的连接数,它记录了自MySQL服务器启动以来,同一时刻并行连接数的最大值。这个值并不表示当前的连接数,而是提供了一个历史记录,用于评估MySQL服务器在过去所承受的最大连接压力。

Max_used_connections_time 表示达到这个峰值的时间。

在成功的与 MySQL 建立连接之后接下来就要开始进入查询的阶段了,因为我们发送给MySQL的请求是我们输入的sql语句(本质上是一段文本)所以首先要对sql 语句进行分析

解析sql

解析sql是借用解析器去把sql语句解析出来,看是否正确可分为 词法解析和语法解析

  1. 词法解析

    顾名思义就是将 sql 语句打碎,转化成一个个的单词,判断单词是否正确

  2. 语法解析

    在输入的sql语句中所有单词都正确的基础上检查该sql的语法是否正确。例如,where是不是写成where1,from写成from1. 表名、列名是否存在、用户是否有操作权限等等。 如果出现错误直接抛出错误。

通过解析器的解析,我们写的 sql 词法正确,语法上也没有错误。那接下来 MySQL 还要对 sql 语句进行预处理操作

预处理

在 MySQL 中,预处理(Prepared Statements)是一种通过编译和执行 SQL 语句的分离来优化性能和增强安全性的技术。预处理语句通常用于防止 SQL 注入攻击,并可以通过减少 SQL 语句的编译次数来提高性能。预处理语句是一种在 SQL 语句中包含占位符(通常是问号 ?)的语句。Mybatis 中拼接 sql 时用的 #{} 和 ${},其中 #{} 就会去解析变成参数,然后进行预处理,能防止sql注入,并且必须传入参数。

查询优化

经过前面几个步骤的洗礼,我们的 sql 语句的所包含的信息完整且语法正确 (所查询的表、列、以及筛选条件都正确),但是我们写的 sql 执行效率不是特别高,需要进行优化。此时优化器就登场了,它会对我们的 sql 语句进行优化(如外连接转化为内连接、表达式简化、子查询转为连接等等)在执行的时候还会判断需不需要走索引,总之优化器会先帮我们做这些工作。优化后会生成一个最终的执行计划,所以这个语句到底如何执行更好,优化器来决定。

到目前为止,我们还未真正的获取到数据。MySQL 把数据的存储和提取操作都封装到了存储引擎中。

存储引擎

执行器去根据表设置的存储引擎,调用不同存储引擎的API接口获取数据。如果要查看当前 MySQL的存储引擎可以通过执行命令

SHOW ENGINES;  -- 查询当前服务器支持的存储引擎

执行结果如下
在这里插入图片描述

在以上存储引擎中常用的存储引擎就只有 InnoDB 和 MyISAM,其中 InnoDB 为默认的存储引擎。我们通过表格的形式来对比一下这两个存储引擎的区别。

对比事务支持外键支持锁机制计数统计主键要求
InnoDB支持支持支持行级锁没有保存表的总行数必须有主键
MyISAM不支持不支持只支持表锁,不支持行锁和页面锁保存有表的总行数允许没有任何索引和主键的表存在

我们都知道数据最终是存到磁盘中的,不同的存储引擎会有自己的存储实现方式。那如何在磁盘里找到数据存储的位置,可以执行如下命令

SHOW VARIABLES LIKE '%datadir%'; 

结果如下
在这里插入图片描述

注:这里是安装的windows 版本的 MySQL, Linux 下的地址会有不同

为了体现不同存储引擎在磁盘中的存储方式不同,我们模拟创建两个存储引擎的表,执行如下命令

CREATE TABLE `t_teacher` (
  `id` int(10) NOT NULL COMMENT '主键id',
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
  `age` int(5) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `t_student` (
  `id` int(10) NOT NULL COMMENT '主键id',
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
  `age` int(5) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE= MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

在上述 sql 片段中我们创建了两个表教师表和学生表,其中教师表采用默认的存储引擎 InnoDB,学生表用 MyISAM 我们来看这两个表在磁盘中的存储情况
在这里插入图片描述

从图上我们可以明显的看出 MyISAM的文件是3个,而InnoDB表数据文件只有1个。

MyISAM磁盘文件

  1. MYD文件 存储所有的数据记录
  2. MYI文件 存储索引信息,即表的索引数据
  3. sdi 系统数据文件,存储一些元数据、表结构,比如行数、空间碎片等

InnoDB磁盘文件

而 InnoDB 的磁盘文件就一个ibd文件存储数据与索引(关于Innodb的具体内容会单独整理一篇文章,此处不做具体的展开)

字符集与比较规则

与 sql执行流程相关的内容梳理完了,我们接下来看一块儿经常容易忽略的内容——字符集和比较规则。众所周知,我们创建数据库的时候都会有这样的选择项
在这里插入图片描述

字符集

字符集(Character Set),也被称为编码表,是一个系统支持的所有字符的集合。为了使计算机能够准确地表示、存储和处理各种文本数据,字符集定义了字符与二进制数据之间的映射关系。在计算机内部,所有的信息都是以二进制形式存储和处理的。字符集就是一套规则,它规定了如何将字符转换为二进制数据,以及如何将二进制数据转换回字符。我们看一下常见的字符集

字符集特征
ASCII共收录128个字符,包括空格、标点、数字、大小写字母及一些不可见字符
ISO 8859-1共收录256个字符是 ASCII 字符集的扩充,它的别名为 Latin1
GB2312收录汉字6763个,其他文字符号682个
GBK是GB2312字符集的扩充,编码方式兼容GB2312
UTF-8(重要)几乎收录了所有的字符,编码一个字符需要1~4字节

其他的字符集稍微了解下即可,我们还是把目光集中在重点的 UTF-8上

MySQL中的字符集

我们在创建数据库时会发现UTF-8字符集时有两个,utf8 与 utf8mb4。正如前面所说 UTF-8 字符集表示一个字符时需要14个字节,而正常情况下一般常用的字符用13个字节就够了,某些特殊的字符则需要1~4的字节来表示(比如表情 emoji)一个字符所用最大字节长度会在某些方面影响性能以及存储。所以我们在创建数据库时看到的 utf8 其实是一个 “简化” 的 UTF-8,它有一个别名叫 utf8mb3 它只使用1~3个字节。utf8mb4 才是正儿八经的 UTF-8 使用1~4个字节。在 MySQL8.0 以后已经将utf8mb4 认定为默认的字符集。那我们要看一下目前 MySQL中有哪些字符集,执行如下命令

show charset;

执行结果如下
在这里插入图片描述

Default collation 代表该字符集默认的比较规则,Maxlen则表示该字符集最多需要几个字节表示一个字符。

字符集比较规则

我们来看一下 UTF-8 系列的字符集有哪些比较规则,执行命令

SHOW COLLATION LIKE'utf8_%';

执行结果如下
在这里插入图片描述

那这么多的比较规则该如何进行选择呢,其实 Default 中 包含 yes的都是默认的比较规则。我们可以看到这些比较规则以 utf-8 开头而后面跟着的是比较规则对应的语言,比如 utf8mb4_polish_ci 表示波兰语比较规则,utf8mb4_spanish2_ci 是西班牙语比较规则。这些我们肯定大概率用不到仅作为一个了解,我们只需要知道 general_ci 结尾的是通用的比较规则就可以了。

附:比较规则后缀代表的含义

后缀含义
_ai不区分重音
_as区分重音
_ci不区分大小写
_cs区分大小写
_bin以二进制方式比较

总结

本篇是 MySQL 章节的开篇,内容不是很多。主要从sql执行流程的角度出发,在执行流程中涉及每个阶段一些 mysql 的信息查看,另外就是总结了下字符集和比较规则的一点冷知识,姑且算做一个开胃小菜。

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

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

相关文章

【AD】1-2 AD24软件的中英文版本切换

1.如图设置软件后,关闭软件重新打开。如果想要切换回英文,将③勾选去掉,关闭软件重新在打开即可。

CSS、Less、Scss

CSS、Less和SCSS都是用于描述网页外观的样式表语言,但它们各自具有不同的特点和功能。以下是对这三者的详细阐述及区别对比: 详细阐述 CSS(Cascading Style Sheets) 定义:CSS是一种用来表现HTML或XML等文件样式的计算机…

【Python项目管理】“无法创建虚拟环境”报错原因及解决方法

一、问题说明 笔者最近在做一个python项目(使用pycharm IDE),在添加python解释器时,提示无法创建虚拟环境(Unable to create virtual environment),如下2图所示: 【添加python解释…

【实践】某央企研究院如何打造IT监控告警平台?

01客户简介: 案例客户为某央企下属研究院。 02痛点分析: 随着信创国产化持续推进,案例客户已完成部分IT核心系统的替代,部署了一系列国产软硬件设施,如Kylinv10操作系统、融智通网络设备等。由于信创生态不够成熟&a…

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类,它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状,也可以用于绘制背景等。通过QBrush,可以设置填充的颜色、样式(如实心、渐变、纹理等&#xff09…

0-1规划的求解

实验类型:◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的:学会使用Matlab编程实现求解0-1规划。 实验内容:1.学习使用Matlab定义子函数的命令function; 2.编程求解0-1型整数规划的枚举法或隐枚举法。 例1:求…

禾川HCQ1控制器程序编译报错如何解决

1、第一次打开用户程序 2、提示库未安装 3、安装库文件 4、脉冲轴库未安装 5、没有错误 去禾川自动化官网,把可以安装的包和库都安装下,程序编译就没有错误了。 6、下载相关包文件

C++进阶-->AVL树的实现

1. AVL树的介绍 1、AVL树的名字来源于他的发明者G. M. Adelson-Velsky和E. M. Landis两个前苏联的科学家,他们名字首元素组成。 2、AVL树就是我们前面二叉搜索树实现的时候提到的平衡二叉搜索树即二叉搜索树的左右孩子都是AVL树,即左右子树的高度差的绝…

【网络安全】|nessus使用

1、扫描结果分析: Sev:漏洞的严重性级别 CVSS:量化漏洞严重性的标准,通过计算得出一个分数,分数越高表示漏洞越严重。 VPR:基于风险的评分系统,帮助组织优先处理风险最高的漏洞。 EPSS&#xf…

P2-5【C语言基本数据类型、运算符和表达式】第五节-知识要点:格式输出函数printf()

讲解视频: P2-5【C语言基本数据类型、运算符和表达式】第五节-知识要点:格式输出函数printf() 知识要点:格式输出函数printf()。 一、任务分析 已知三角形三边a,b,c的值,求三角形的面积。要求输出a&#…

RFID资产管理

随着物联网和智能制造的发展,RFID资产管理逐渐成为企业提升运营效率的重要工具。利用RFID技术,企业能够实时跟踪和管理各种固定资产,从而提高资产利用率,降低运营成本。在现代化的管理体系中,RFID资产管理不仅限于资产…

Vue2——单页应用程序路由的使用

一.单页应用程序与多页应用程序之间的比较 二.单页的应用场景 系统类网站 / 内部网站 / 文档类网站 / 移动端网站 三.路由的介绍 1. 什么是路由 路由是一种映射关系 2. Vue中的路由是什么 路径和组件的映射关系 四.VueRouter的使用 5个基础步骤(固定) …

苹果ipa上架apple store 遇到的问题汇总已经解决方案!

大家伙,我是小黄。 最近在将ipa上架到apple store的时候遇到了一些问题,经过很长时间的摸索和修改终于成功上架了,下面是我遇到的问题和解决过程,希望可以帮助到大家。 一: Guideline 1.3 - Safety - Kids Category …

数据库三范式(1NF、2NF、3NF)

1NF(第一范式) 定义:确保每一列都是原子值,即是不可分割的基础数据项。 所谓第一范式(1NF)是指在关系模型中,对于添加列的一个规范要求,所有的列都 应该是原子性的,即数…

亚马逊CEO安迪·贾西(Andy Jassy)近日透露,Alexa助手即将迎来一次重大升级,具备“代理性”功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

ts:函数的重载

ts:函数的重载 1 主要内容说明2 例子2.1 函数的重载2.1.1 源码1 (函数的重载)2.1.2 源码1运行效果 3.结语4.定位日期 1 主要内容说明 重载函数可以提高类型安全性,内容灵活性和可读性。重载允许同一个函数定义多个参数类型的数量…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件,它提供了一个标签页式的界面,允许用户在不同的页面(或称为标签)之间切换。每个页面都可以包含不同的内容,如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

telnet 密码模式 访问路由器

telnet 密码访问华为路由器 模拟被访问路由 sy [Huawei]int g0/0/0 //选中 g0/0/0端口 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.1 24 //设置端口ip [Huawei]user-interface vty 0 4 //配置vty [Huawei-ui-vty0-4]set authentication password cipher huawei123 //设置…

项目模块1~12总结:服务器大模块梳理

一、思维导图 二、设计思路 1、各种回调函数梳理 服务器里面包含了监听套接字和监听到的通信套接字(新连接),我们要对这两种套接字进行设置回调函数,其中监听套接字里面只要设置读回调,通信套接字要设置5种回调&…

UE4安卓Gradle工程中的libUE4.so的生成原理

流程图 流程图放在最前面,下面是讲解。 libUE4.so 问:在UE4安卓开发中,libUE4.so即是符号表,又是引擎代码native,是吗? 答:是的,libUE4.so在UE4安卓开发中既包含符号表,…