【MySQL】MySQL 知识点总结

news2024/11/17 7:35:49

文章目录

  • 前言
  • 关系型数据库和非关系型数据库
    • 关系型数据库
    • 非关系型数据库
    • 关系型数据库与非关系型数据库之间的区别
  • MySQL整体架构
    • SQL 的执行步骤
    • MySQL 的架构图示
    • 连接器
    • 分析优化和执行
      • 查询缓存
      • 分析器
      • 优化器&执行器
    • 存储引擎
      • MyISAM和InnoDB的区别
  • 事务
    • 事务的四大特性
    • 隔离级别
    • 多个事务之间引发的隔离问题
    • 事务隔离总结
    • 事务死锁
  • MySQL的日志
  • 索引
    • 建立索引的注意事项
    • MySQL中的索引
  • 数据库优化

前言

MySQL相信大家都耳熟能详了, 毕竟其还不错的性能和免费的特点深受国人的喜爱, 本篇文章将作为我《MySQL》系列的一篇文章, 主要用作整理和简单的概述MySQL相关的一些知识点
ok, 接下来我们开始进入正题, 从最简单的开始

关系型数据库和非关系型数据库

关系型数据库

关系型数据库是一个结构化的数据库, 创建在关系模型(二维表格模型)基础上, 一般面向于记录
SQL 语句就是一种基于关系型数据库的语言, 用于执行对关系型数据库中数据的检索和操作, 主流的关系型数据库包括: Oracle, MySQL, SQL Server等
本篇文章默认以 MySQL的 InnoDB引擎为主

非关系型数据库

非关系型数据库也叫 NoSQL, 采用键值对的形式进行存储. 一般来讲, 除了主流的关系型数据库之外的数据库, 都认为是非关系型
他的读写性能很高, 易于扩展, 主流的 NoSQL有: Redis, MongDB, Hbase等
适合使用的场景:

  • 日志系统
  • 数据量巨大
  • 地理位置存储
  • 高可用

关系型数据库与非关系型数据库之间的区别

  • 关系型数据库:

    • 采用了关系模型来组织数据, 容易理解
    • 可以保持数据的一致性
    • 数据更新的开销比较小
    • 支持复杂查询(where子句等)
  • 非关系型数据库

    • 不需要经过 SQL层的解析, 读写效率高
    • 基于键值对, 数据的扩展性很好
    • 可以支持多种类型的数据的存储, 图片, 文档等

MySQL整体架构

SQL 的执行步骤

在 MySQL中, Server层按顺序执行SQL的步骤如下:

  • 客户端请求
  • 连接器(验证用户身份, 给与权限)
  • 查询缓存(存在缓存则直接返回, 不存在则执行后续操作)
  • 分析器(对SQL进行词法分析和语法分析操作)
  • 优化器(主要对执行的 SQL优化选择最优的执行方案方法)
  • 执行器(执行时会先看用户是否有执行权限, 有才去使用这个引擎提供的接口)
  • 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)

接下来我将按照 MySQL执行 SQL的步骤来进行讲解

MySQL 的架构图示

图1 展示了 MySQL各组件之间协同工作的逻辑视图, 也是一条SQL查询的执行流程, 接下来我主要围绕这张图来讲述一下他们和 MySQL之间的关系
在这里插入图片描述

图1 MySQL架构逻辑视图(图片来自于JavaGuide)

客户端的服务主要是包括连接处理, 身份验证, 确保安全性等.
大多数 MySQL的核心功能都在第二层, 包括查询解析, 分析, 优化, 以及所有的内置函数, 所有跨存储引擎的功能也都在这一层来实现: 存储过程, 触发器, 视图等

第三层是存储引擎层, 负责MySQL中数据的存储和提取. 其架构模式是插件式的, 支持 InnoDB, MyISAM, Memory等多个存储引擎, 现在最常用的存储引擎是 InnoDB, 在 MySQL 5.5版本之后成为了默认存储引擎

连接器

默认情况下, 每个客户端连接都会在服务器进程中拥有一个线程, 该连接的查询只会在这个线程中执行.
当客户端(应用)连接到 MySQL服务器时, 服务器需要对其进行身份验证, 身份验证基于用户名, 密码, 主机ip和端口号, 客户端连接成功之后, 服务器会继续验证该客户端的查询权限(例如, 是否有查看user库的权限, 是否允许对mysql库的user表进行SELECT)
在这里插入图片描述
创建新连接时身份验证基本信息

分析优化和执行

查询缓存

在执行一条 SELECT查询语句的时候会先去查询缓存看能否直接命中, 能命中就直接返回, 缓存中没有才会去进行下一步

只要表有更新操作, 那么这张表的缓存就会更新, 所以对于一张更新较[]频繁的表来说缓存命中是比较低的 从 MySQL 5.7.20版本开始,
查询缓存已经被官方标注为废弃了, 8.0版本完全移除 在 MySQL 8.0版本之前, 想关闭查询缓存可以将参数
query_cache_type 设置为 DEMADN

分析器

在该步骤主要进行两件事:

  • 词法分析根据你的SQL语句识别出关键字来构建语法树, 方便后面的模块获取表名, 字段名, where条件等
  • 语法分析根据词法分析结果, 语法分析会判断你输入的SQL语句是否满足 MySQL语法

优化器&执行器

在优化器中主要做了三件事:

  • prepare 预处理阶段:

    • 查询 SQL中的表, 字段是否存在
    • 将 select * 上的 * 扩列为所有列
  • optimize 优化阶段:

    • 判断当前 SQL语句使用的索引类型, 主键索引, 普通索引, 覆盖索引, 全表扫描等
  • execute 执行阶段:

    • 根据优化结果执行 SQL查询, 从存储引擎中获取查询结果并返回

优化器并不关心查询引擎类型, 但是存储引擎对于查询优化是有影响的.

存储引擎

在 MySQL中, 可以使用 show engines命令来查询 MySQL支持的所有存储引擎
在这里插入图片描述

可以看到, 当前默认存储引擎是InnoDB, 同时只有InnoDB是支持事务的

MyISAM和InnoDB的区别

老生常谈了, 也是面试高频考点

MyISAMInnoDB
行级锁只有表级锁支持行级锁和表级锁, 默认为行级锁
事务不支持事务实现了四个隔离级别, 具有提交和回滚事务的能力, 默认使用 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的
外键不支持支持, 在阿里的<java开发手册>中是不推荐使用外键的
异常崩溃后的安全恢复不支持支持, redo log
MVCC不支持支持

事务

事务的四大特性

  • 原子性: 一个事务中的数据操作, 要么全部成功, 要么全部失败并回滚到执行之前的状态
  • 一致性: 事务操作前后, 数据满足完整性约束, 数据库保持一致性状态
  • 隔离性: 事务之间相互隔离, 互不影响, 每个事务都有一个完整的数据空间, 在一个事务结束之前对其他事务来讲应该是不存在的
  • 持久化: 事务结束之后, 对数据的操作即为永久的, 即便系统故障也不会消失

隔离级别

  • 未提交读 (READ UNCOMMITTED): 在事务中可以查看其他事务未提交的修改

    • 读取未提交的事务也叫脏读
  • 读提交 (READ COMMITTED):一个事务可以看到其他事务在他开始之后提交的修改

    • 同一个事务两次执行相同语句可能会看到不同的数据结果, 不可重复读
  • M可重复读(REPEATABLE READ): 同一个事务在多次读取相同行数据的结果相同

    • 当一个事务执行范围查询过程中, 另外一个事务对该范围进行了插入操作, 当再次对该范围进行查询的时候, 就会出现幻行, 也就是幻读
  • 串行化(SERIALIZABLE):最高的事务隔离级别, 解决了幻读问题. 其会在读取的每一行数据都进行加锁操作

多个事务之间引发的隔离问题

  • 脏读: 读取未提交的事务
  • 不可重复读: 同一个事务两次执行相同语句可能会看到不同的数据结果
  • 幻读: 当一个事务执行范围查询过程中, 另外一个事务对该范围进行了插入操作, 当再次对该范围进行查询的时候, 就会出现幻行

不可重复度重点在于修改, 幻读重点在于新增或删除

事务隔离总结

SQL的隔离级别

隔离级别脏读不可重复读幻读加锁读
未提交读
提交读
可重复读
串行化

事务死锁

当有两个或两个以上的事务互相持有和请求相同资源上的锁, 就会产生循环依赖, 我们将其称之为死锁

为了解决事务死锁问题, 数据库系统实现了死锁检测和锁超时机制. 在InnoDB引擎中, 检测到循环依赖后会自动返回一个错误信息

MySQL的日志

在 MySQL中一共有三种日志, 分别是:

  • redo log(重做日志): 是 InnoDB存储引擎层生成的日志, 实现了事务中的持久性, 主要用于故障恢复
    undo log(回滚日志): 是 InnoDB存储引擎层生成的日志, 实现了事务中的原子性, 主要用于事务回滚和- MVCC
  • binlog(归档日志): 是 Server层生成的日志, 主要用于数据备份和主从复制

索引

建立索引的注意事项

建议建立索引的字段:

  • 频繁查询的
  • 用以缩小查询范围的
  • 排序的字段
  • 不建议用来建立索引的字段:
  • 查询少且涉及的列或重复值多的
  • 特殊的数据类型, 例如: text
  • 可以为null的字段, 索引为null时会导致引擎放弃使用索引而进行全表扫描

MySQL中的索引

  • 主键索引: 加速查询 + 列值唯一(不允许为null) + 表中不允许有重复
  • 唯一索引: 加速查询 + 列值唯一(允许有null)
  • 普通索引: 加速查询
  • 组合索引: 多列组合成一个索引
  • 哈希索引
  • B树索引
  • B+树索引
  • 聚簇索引: 表数据和主键一起存储, 主键索引的叶节点存储行数据, 二级索引的叶节点存储行的主键值.
  • 非聚簇索引

数据库优化

  • 范式优化: 消除冗余
  • 反范式优化: 增加冗余, 减少 join
  • 限定数据的范围: 禁止不带限制的范围查询
  • 读/写分离: 主库写, 从库读
  • 拆分表: 分库分表, 物理层面上将数据分区, 可以避免扫描全表, 明显缩短查询时间

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

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

相关文章

【电动车】基于双层凸优化的燃料电池混合动力汽车研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

聚观早报 | 巴菲特后悔减持苹果;羊了个羊侵害用户权利被通报;

今日要闻&#xff1a;巴菲特两年前减持苹果是个愚蠢的决定&#xff1b;羊了个羊侵害用户权利被通报&#xff1b;英特尔预计二季度营收同比下滑&#xff1b;陆奇最称中国要先赶上GPT-3.5&#xff1b;任天堂对GitHub展开大规模DMCA行动 巴菲特两年前减持苹果是个愚蠢的决定 在伯…

【Linux】Redis数据库、实例项目搭建redis服务器环境下mysql实现la/nmp架构缓存

一、Redis简介 Redis 是当前互联网世界最为流行的 NoSQL&#xff08;Not Only SQL&#xff09;数据库。NoSQL 在互联网系统中的作用很大&#xff0c;因为 它可以在很大程度上提高互联网系统的性能。 Redis 具备一定持久层的功能&#xff0c;也可以作为一种缓存工具。对于 NoSQL…

【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

盖雅案例入选「首届人力资源服务国际贸易交流合作大会20项创新经验」

近日&#xff0c;首届人力资源服务国际贸易交流合作大会顺利召开。为激励企业在人力资源服务贸易领域不断创新&#xff0c;加快培育对外贸易新业态、新模式&#xff0c;形成人力资源服务领域国际竞争新优势&#xff0c;大会评选出了「首届人力资源服务国际贸易交流合作大会20项…

第2天学习——Docker安装

一、前言 Docker 是一个用于开发、传送和运行应用程序的开放平台。Docker 使您能够将应用程序与基础设施分开&#xff0c;以便您可以快速交付软件。使用 Docker&#xff0c;您可以像管理应用程序一样管理基础设施。通过利用 Docker 的快速交付、测试和部署代码的方法&#xff0…

sqli-labs通关(十四)(十五)(十六)

第十四关 输入1",出现如下报错信息&#xff0c;告诉我们要双引号闭合 所以我们输入 1" or 11# 没有任何返回信息&#xff0c;这一关和十三关一样&#xff0c;利用报错信息爆出数据 1" and extractvalue(1,concat(0x7e,(select database())))# 第十五关 输入1是这…

【软件测试】第二章 黑盒测试

系列文章目录 文章目录 系列文章目录前言第二章 黑盒测试2.1 等价类划分2.2 边界值分析2.3 因果图法2.4 判定表驱动2.5 正交试验法2.6 其他黑盒测试方法2.7 功能性测试总结 总结 前言 第二章 黑盒测试 黑盒测试&#xff1a;功能测试或数据驱动测试测试对象&#xff1a;需求规格…

发布会实录|悠易科技CTO李旸:洞察新引擎 品牌新增长

4月26日&#xff0c;悠易科技LinkFlow对其核心的 “洞察”产品能力进行了升级。作为开场嘉宾&#xff0c;悠易科技CTO李旸做了题为《洞察新引擎 品牌新增长》的精彩分享&#xff0c;为我们阐释了本次发布升级的背景和出发点&#xff0c;帮助我们更好地理解LinkFlow CDP如何借助…

【postgresql】一些函数记录

1、coalesce函数&#xff1a;合并&#xff0c;coalesce(值1&#xff0c;值2&#xff0c;值3……)&#xff0c;返回第一个不为null的值&#xff1b; 2、coalesce和ifnull的区别&#xff0c;ifnull只有两个参数&#xff0c;返回第一个不为null的参数 3、if和casewhen的区别&…

信息安全评估

安全评估基础 概念、作用、安全评估标准 安全评估基本概念 什么是安全评估 针对潜在影响资产正常执行其职能的行为产生干扰或者破坏的因素进行识别、评价的过程 对安全评估的理解 狭义指对一个具有特定功能的工作系统中固有的或潜在的危险及其严重程度所进行的分析与评估&a…

通用路由封装协议GRE

通用路由封装协议原理 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中…

国产AI大模型酣战,科大讯飞打响“智慧涌现”第一枪

配图来自Canva可画 ChatGPT问世半年之久&#xff0c;人与AI“你问我答”的游戏热度不降反升&#xff0c;AI大模型技术需求也随之水涨船高&#xff0c;成为科技企业重点关注的方向。 在海外&#xff0c;OpenAI、谷歌、微软的AI大模型战争正打得火热&#xff1b;在国内&#xf…

PowerShell系列(二):PowerShell和Python之间的差异介绍

目录 1、Python定义 2、Python用途 4、PowerShell用途 5、PowerShell和Python对比 5.1 共同点 5.2 不同点 6、总结 今天给大家聊聊PowerShell和Python之间有哪些共同之处&#xff0c;各自有哪些优势&#xff0c;希望对运维的朋友了解两种语言能提供一些有用的信息。 1、Python定…

Unit 为啥还能当函数参数?面向实用的 Kotlin Unit 详解

视频先行 下面是视频内容的脚本文案原稿分享。 文案原稿 很多从 Java 转到 Kotlin 的人都会有一个疑惑&#xff1a;为什么 Kotlin 没有沿用 Java 的 void 关键字&#xff0c;而要引入这个叫 Unit 的新东西&#xff1f; // Java public void sayHello() {System.out.println(&qu…

Unity大面积草地渲染——2、草地的动态交互

大家好&#xff0c;我是阿赵。 这里继续讲大面积草地渲染的第二个部分&#xff0c;草地动态交互。这里主要有风吹效果和球体碰撞效果2种。 一、风吹效果 Unity使用shader控制草的渲染和动画 风吹动草的效果&#xff0c;主要还是使用顶点程序来控制顶点的偏移 回顾一下之前的基…

全方位揭秘!大数据从0到1的完美落地之Shuffle和调优

MapReduce高级 shuffle阶段 概述 MapReduce会确保每个reducer的输入都是按键排序的。从map方法输出数据开始、到作为输入数据传给reduce方法的过程称为shuffle。在此&#xff0c;我们将学习shuffle是如何工作的&#xff0c;因为它有助于我们理解工作机制&#xff08;如果需要…

MYSQL数据库进阶多表查询,MYSQL数据库主键和外键

目录 友情提醒第一章&#xff1a;MYSQL数据库多表主键和外键1&#xff09;外键介绍&#xff08;FOREIGN KEY&#xff09;2&#xff09;外键约束作用2&#xff09;三种情况下添加外键约束①一对一关系②一对多关系多对多关系 4&#xff09;删除外键约束 第二章&#xff1a;MYSQL…

配置您的 Web 服务器以包含 X-Frame-Options 标头

介绍 X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, </iframe> 或者 <object> 中展现的标记。网站可以使用此功能&#xff0c;来确保自己网站的内容没有被嵌套到别人的网站中去&#xff0c;也从而避免了点击劫持 (clickjackin…

mysql数据库之备份和恢复

1.数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中&#xff0c;数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因&#xff1a; 程序错误人为,操作错误,运算错误,磁盘故障灾难&#xff08;如火灾、地震&#xff09;和盗窃. 2.数据…