mysql高级,mysql体系结构,mysql引擎,存储过程,索引,锁

1.mysql体系结构

1) 连接层

主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2) 服务层

第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如 过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询的顺序,是否利用索引等, 最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。

3) 引擎层 [存储引擎]

数据存储层, 主要是将数据存储在文件系统之上,并完成与存储引擎的交互。

存储引擎层, 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。 在之前[MyISAM]: MySQL5.5之后,MySQL默认的存储引擎就是InnoDB,InnoDB默认使用的索引结构就是B+树,上面的服务层就是通过API接口与存储引擎层进行交互的

4)存储层

和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎上,插件式的存储引擎架构,将查询处理和其他的系统任务以及数据的存储提取分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

2.mysql引擎

MySQL5.5之前的默认存储引擎是MyISAM,5.5之后就改为了InnoDB。

InniDB支持事务,行级锁,外键

mylSAM  不支持事务和外键,支持表级锁

InnoDB存储引擎是Mysql的默认存储引擎。InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。

3.存储过程

MySQL 中的存储过程是一种预编译的 SQL 脚本,它可以存储在数据库服务器上,并通过一个名称来调用。存储过程可以在数据库级别上封装一组复杂的操作,这样可以简化客户端应用程序与数据库之间的交互,并且可以提高性能和安全性。

1.创建存储过程

CREATE PROCEDURE te01()
BEGIN
  SELECT 'hello';
END;

调用
call te01();

2.删除

DROP PROCEDURE te01;

3.定义变量

create PROCEDURE te02()
BEGIN
  declare num int default 5;
  SELECT num + 20;
END;
call te02();


4.直接赋值使用 SET

CREATE PROCEDURE te03()
BEGIN 
 DECLARE num int DEFAULT 1;
 set num=10;
 SELECT num;
 END;
 CALL te03();

5.通过select ... into 方式进行赋值操作

CREATE PROCEDURE te04()
BEGIN
  DECLARE num VARCHAR(20);
  SELECT city_name into num from city_innodb WHERE city_id=1;
  SELECT num;
  END;
  call te04();

6.if条件判断

CREATE PROCEDURE ce03(in m int,out result VARCHAR(200))
BEGIN
  if m in (1,3,5,7,8,10,12) then set result='31天';
  ELSEIF m=2 then set result='28天';
  ELSE set result='30天';
  end if;
END;
call ce03(2,@r);
SELECT @r;

7.case

CREATE PROCEDURE te08(in n int)
BEGIN
 CASE 
    WHEN n in (1,3,5,7) THEN
        SELECT '奇数';
   WHEN n in (2,4,6,7) THEN
        SELECT 'o数';
    ELSE
        SELECT '输入错误';
END CASE;
END;
call te08(5);

8.while

CREATE PROCEDURE te09(in n int,out sum INT)
BEGIN 
  set sum=0;
  WHILE n>=1 DO
    set sum=sum+n;
  set n=n-1;
END WHILE;
END;
call te09(100,@sum);
SELECT @sum;

9.repeat 类似do{}while

CREATE PROCEDURE te10(in n int,out sum int)
BEGIN
  set sum=0;
  REPEAT
    set sum=sum+n;
  set n=n-1;
UNTIL n=0 END REPEAT;
END;
CALL te10(100,@sum);
SELECT @sum;
 

4.索引

索引它就是一种数据结构,可以帮mysql快速查找到相应的数据。

一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的手段

4.1索引优势劣势

4.2索引结构

不同的数据库引擎使用的索引结构不同,一般多用B+树

  • B+TREE 索引 : 最常见的索引类型,大部分引擎都支持 B 树索引。

  • HASH 索引:只有Memory引擎支持 , 使用场景简单 。

  • Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。

4.3二叉树,红黑树,B+树

二叉树的缺点:顺序插入时,会形成一个链表,查询性能大大降低,在大量数据的情况下层级较深,检索速度慢

红黑树:大量数据的情况下,层级较深,检索速度慢

B树,采用多路平衡,每个节点既存放索引又存放数据

B+树,根节点只存放索引,所有数据都存放在中叶子节,并且叶子节点会形成一个双链表,方便范围内查找,且查找效率比较稳定

4.4索引分类

按索引字段的特性分类 

普通索引   

  • 即一个索引值包含单个列。一个表可以有多个单例索引

唯一索引

  • 与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值

主键索引    它是一种特殊的唯一索引,不允许有空值

联合索引(多列索引,组合索引,复合索引)

  • 一个索引包含多个列,专门用于组合搜索,其效率大于索引合并

全文索引

按索引的存储形式

聚集索引        将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
必须有,而且只有一个
二级索引        将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键
可以存在多个

索引的语法

create index 索引名[name_index] on 表名(name)

type索引类型 

system :根据主键索引

const::根据唯一索引

eq_ref和ref:根据普通索引

range:索引范围查询

index和all:没有索引查询

平常的到达了range即可,尽量到ref

如何分析sql

explain  一般查看哪些指标:type索引类型key:实际使用的索引key_len索引的长度row:影响得到行数

索引失效的场景:

1.使用联合索引时必须满足最左前缀法则

从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

2.使用联合索引时,某个字段进行了范围查询,它的右侧索引会失效(创建索引时的顺序)

3.索引运算,索引列上有运算操作的话会失效

4.字符串索引类型的字段查询时没有使用 ' '

5.模糊查询,尾部模糊索引不会失效,头部模糊会失效

6.or  连接了一个索引字段,or后面的字段没有索引则导致索引字段也会失效

7.覆盖索引

查找的条件和需要的数据都能在索引中找到,不需要再回表

5.锁

5.1锁的分类

从对数据操作的粒度分 :

1) 表锁:操作时,会锁定整个表。MyISAM 5.6 后InnoDB支持

2) 行锁:操作时,会锁定当前操作行。Innodb

从对数据操作的类型分:

1) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。

2) 写锁(排它锁):当前操作没有完成之前,它会阻断其他写操作和读操作。

MySQL这2种锁的特性可大致归纳如下 :

锁类型特点
表级锁偏向MyISAM 存储引擎,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

5.2mylsam表锁

MyISAM 存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。

MyISAM 在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT 等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用 LOCK TABLE 命令给 MyISAM 表显式加锁。 但是我们为了演示出效果人为加锁。

显示加表锁语法:

加读锁 : lock table table_name read; 

加写锁 : lock table table_name write;--- insert delete updpate

释放锁:   unlock tables; -- 执行完毕

5.3InnoDB 行锁

行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是 采用了行级锁。

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

  • 共享锁(S):又称为读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

  • 排他锁(X):又称为写锁,简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

    当执行修改操作,默认innodb就会给数据库表中对应的行加排他锁

对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);

对于普通SELECT语句,InnoDB不会加任何锁;

行级锁:

分成: 共享锁: 执行select时会自动添加该锁。 不影响其他的操作。

        排他锁: 执行更新操作时自动添加该锁。影响其他事务的更新操作

5.3.2悲观锁和乐观锁

悲观锁:

乐观锁: 增加一个version字段,---一个事务进行操作时,该事务会先获取version的值。当这个事务操作完成后,查看数据库中的version字段值是否和当前自己家拥有的version字段的值相同。如果相同则修改成功并对version+1,如果不同则不修改。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity高清渲染管线

Unity高清渲染管线——1 unity高清渲染管线是渲染管线的一种,在看完《创造高清3D虚拟世界》这本书的前两章以及第三张第二小节后终于对unity的高清渲染管线也是有了一个初步的认知,以下是我个人理解仅作参考: unity高清渲染管线项目模板比起…

Python基础语法元素(学习笔记)

实例1:温度转换 # TempConvert.py #为单行注释 多行注释为: 这里写内容 TempStr input("请输入带有符号的温度值:") if TempStr[-1] in [F,f] :C (eval(TempStr[0:-1])-32)/1.8print("转换后的温度是{:.2f}C".format(C)) e…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具,而 TensorBoardX 是其社区驱动的替代品,支持 PyTorch 等其他框架。以下是它…

flutter-实现瀑布流布局及下拉刷新上拉加载更多

文章目录 1. 效果预览2. 结构分析3. 完整代码4. 总结 1. 效果预览 在 Flutter 应用开发中,瀑布流布局常用于展示图片、商品列表等需要以不规则但整齐排列的内容。同时,下拉刷新和上拉加载更多功能,能够极大提升用户体验,让用户方…

【day2】数据结构刷题 栈

一 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

YAML是什么?

YAML(YAML Ain’t Markup Language)是一种以数据为中心、高度可读的序列化语言,广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析: 1. 定义与历史演变 全称与定位: YAML的全称最初为“Yet…

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题,微服务雪崩问题就是指在微服务架构中,当一个服务出现故障时,由于服务之间的依赖关系,故障可能会传播到其他服务,从而导致了大规模的服务失败,系统无法正…

反序列化漏洞

前提概要 本文章主要用于分享反序列化漏洞基础学习,以下是对反序列化漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 反序列化漏洞描述 反序列化漏洞是指程序在对输入的字节流进行反序列化时,因缺乏充分的验证和过…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…

STM32学习笔记之存储器映射(原理篇)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录,使用合宙erp账号登录即可 点击右上角构建,点击右上角菜单新构建,自定义构建名称,可新建多个 勾选想要的组件 点击右上角保存修改,只有点击准备就绪(注意:一定…

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15(2016) 核心架构:Stack Reconciler(栈协调器) 工作原理: 同步递归渲染:采用深度优先遍历方式递归处理 Virtual DOM,形成不可中断的调用栈渲染流程:1. 触发 …

【HarmonyOS NEXT】EventHub和Emitter的使用场景与区别

一、EventHub是什么? 移动应用开发的同学应该比较了解EventHub,类似于EventBus。标准的事件广播通知,订阅,取消订阅的处理。EventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力。 类似的框架工具有很多…

QT记事本

记事本应用程序提供了基本的文本编辑功能,支持文件的新建、打开、保存和另存为操作,同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp:程序的入口点,负责初…

如何用 Postman 发送 POST 请求?

POST 请求是 HTTP 协议中用于提交数据的一种方法,Postman 提供了丰富的功能来支持用户发送包含各种信息的 POST 请求,如文本数据、JSON 或 XML 数据结构、文件等。 Postman 发送 post 请求教程

Ant Design Vue 中的table表格高度塌陷,造成行与行不齐的问题

前言: Ant Design Vue: 1.7.2 Vue2 less 问题描述: 在通过下拉框选择之后,在获取接口数据,第一列使用了fixed:left,就碰到了高度塌陷,查看元素的样式结果高度不一致,如&#x…

Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案

文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中,需要将 Oracle 数据库的变更数据(CDC) 采集并写入 Apache Doris&am…

qt+opengl 加载三维obj文件

1前面我们已经熟悉了opengl自定义顶点生成一个立方体,并且我们实现了立方体的旋转,光照等功能。下面我们来用opengl来加载一个obj文件。准备我们首先准备一个简单的obj文件(head.obj)。资源在本页下载 2 在obj文件里面&#xff0c…

计算机组成原理的学习day01

一 计算机系统层次结构 1 计算机硬件的基本组成 好的,上个小节中我们了解了计算机系统的概念,还有计算机的一个发展历程,那这个小节中我们会着重的探讨计算机硬件的一个基本组成。我们需要掌握这样的两种结构,第一种是早期的冯诺…