当前位置: 首页 > news >正文

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,如果不同则不修改。

相关文章:

  • Linux-数据结构-哈夫曼树-哈希表-内核链表
  • SQL 视图
  • linux,防火墙,firewall,常用命令
  • FastAPI系列02:FastAPI程序结构与生命周期
  • Web Workers优化 Web 网站的性能
  • Unity2D 五子棋 + Photon联网双人对战
  • Postman 如何发送 JSON 格式的 API 请求?
  • 2025-03-24 学习记录--C/C++-PTA 习题7-4 求矩阵各行元素之和
  • 关于Qt的各类问题
  • MOSN(Modular Open Smart Network)-08-MOSN 扩展机制解析
  • Three.js 快速入门教程【十八】射线拾取模型——鼠标点击屏幕选中模型或物体
  • 和鲸科技医疗智能体上线联想擎天平台:赋能医疗服务效率与质量
  • 车载以太网网络测试 -24【SOME/IP概述】
  • SpringBoot3.0不建议使用spring.factories,使用AutoConfiguration.imports新的自动配置方案
  • RabbitMQ 学习整理1 - 基础使用
  • C++中的explicit关键字
  • STM32收发数据包中间件——ProtoFlow,更方便的打包解包助手
  • SpringCloud入门、搭建、调试、源代码
  • 洛谷题单1-B2002 Hello,World!-python-流程图重构
  • 【QT继承QLabel实现绘制矩形、椭圆、直线、多边形功能,并且支持修改大小,移动位置,复制,粘贴,删除功能】
  • 加拿大警方:已确认有9人在温哥华驾车撞人事件中遇难
  • 张译、惠英红分获第二十届中国电影华表奖优秀男、女演员奖
  • 铜钴巨头洛阳钼业一季度净利润同比大增九成,最新宣布首度进军黄金矿产
  • 贵州通报9起群众身边不正之风和腐败问题典型案例
  • 一季度公募管理规模出炉:44家实现增长,4家规模环比翻倍
  • 国铁集团:一季度全国海铁运输商品车同比增长33.62%