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

MySQL-学习笔记

基础篇

sql字段

在这里插入图片描述

1. date 类型

date类型用于存储日期值,格式为’YYYY-MM-DD’,显示范围是从’1000-01-01’到’9999-12-31’。它只包含日期部分,不包含时间部分。

2.datetime 类型

datetime类型用于存储日期和时间值,格式为’YYYY-MM-DD HH:MM:SS’,显示范围是从’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。它同时包含日期和时间部分

在java 开发中, 无论是String类型的对象, 或者是 java.util.Date() 类型的对象都是可以作为 日期类型的数据直接传入的.

mysql这边都可以很好的兼容~

可能还存在一些其他类型的 对象也可以被 mysql的日期类型所兼容 。

SQL 语法

SQL执行顺序

在这里插入图片描述

分组

在这里插入图片描述

查询的字段一般为 聚合函数分组字段 , 其他字段无任何意义.

内连接

在这里插入图片描述

外连接

在这里插入图片描述

自连接

在这里插入图片描述

联合查询

在这里插入图片描述

子查询

在这里插入图片描述

进阶篇

1.关于DQL 的执行顺序

DDL : 数据定义语言

DML : 数据更改语言
在这里插入图片描述

执行顺序如下:
1. From
2. where
3. GROUP BY
4. HAVING 
5. SELECT 
6. ORDER BY 
7. LIMIT

在这里插入图片描述

日期类 的函数

在这里插入图片描述

【注意】这里的DAY() 得到的日期只是这个 单纯的日, 并不包含其他的数字部分。

DATEDIFF (date1,date2) ,这里的话是用 date1 - date2 得到的是一个正值。

2.事务简介

事物是一组操作的集合, 它是一个不可分割的工作单位, 事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求, 即这些操作要么同时成功,要么同时失败。

MySQL 的事务是默认自动提交的。

1,set @@autocommit = 0; 设置事务的提交方式为手动提交 , 1是自动提交

2,也可以设置这个 set autocommit = off 关闭自动提交

3,start transaction

事务的隔离级别查询:
1.查看当前会话隔离级别 select @@tx_isolation; 或者select @@Transaction_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 set global transaction isolation level repeatable read; 5.命令行,开始事务时 set autocommit=off 或者 start transactionbegin; 也可以开启事务

在这里插入图片描述

  • 脏读: 对于脏读,我们只有在数据的隔离级别为这个 未提交读 的 隔离级别下才会有这种情况的发生。
  • 不可重复读已提交读的事务隔离级别 下, 在一个事务A中 两次读取同一个数据之间, 有别的事物更改了这个数据, 那么此时就会发生两次读取到的数据不一致的问题, 也就是这个不可重复读的情况。

在这里插入图片描述

【注意】 在出现幻读的前提是: 已经解决了这个不可重复读的问题, 隔离级别到了这个可重复读。 
【可重复读】: 就是在一次事务A中, 两次读取同一个数据, 即使中间有其他事务B去对我们的这个数据进行了修改,并且提交,
但是, 我们事务A的两次读取数据都是一致的。这里看到的这个资料的意思是, 事务A 可以看到在事务A 开始之前的提交后的数据,但是在事务开始之后的对数据的修改本事务是看不到的 
  • 幻读:在这个 可重复读的隔离级别 下,数据会发生幻读的情况。 比如事务A 的刚开始先去查询id为1的数据,此时没有查到。然后事物B进行了一次数据的插入, 插入了一条id = 1 的数据, 然后事物A再执行这个插入一条id为1的数据,但是会插入失败,但是如果再查询一次的话,仍然是没有。 因为是已经是可重复读的隔离级别下~

在这里插入图片描述

事务的隔离级别:

在这里插入图片描述

从上图中我们可以明显的看到这个: 在默认的隔离级别下, 还是会有这个幻读的发生的可能。 存在这个问题
串行化的隔离级别是最好的, 并发性能是最低的。我们的每一个sql都是需要经历开启事务和提交的阶段的. 
增删改查当隔离级别是串行化的时候, 当有一个事务开启的时候, 别的事务的提交都不会执行成功。 只有等最先开始的事物提交成功commit 了,
才会让别的事物commit
set session transaction isolation level read uncommitted;  -- 设置事务的隔离级别为 读已提交  /  是当前会话的隔离级别

在可重复读事物隔离级别下:

有2个概念:

  • 可重复读: 是对于同一条数据, 是不会读取到其他事物未提交的数据的, 当然这个是已提交读的事物隔离级别就已经实现的功能。

​ 但是相比于已提交读隔离级别的增加的特性是: 对于在一次事物中, 2次读取到的同一条数据是一致的, 即使有其他事物对 其更改了, 这个是已提交读的隔离级别做不到的.

但是存在的问题是: 但是对于别的事物的 insert 语句是防止不住的, 如果是一个条件查询, 在一个事物A中2次查询其间, 有另一个事物B, 插入了一些满足条件的数据, 就会导致出现幻读现象。 2次读取到的数据不一致。

幻读,目前我了解的有两种说法:

说法一:事务 A 根据条件查询得到了 N 条数据,但此时事务 B 删除或者增加了 M 条符合事务 A 查询条件的数据,这样当事务 A 再次进行查询的时候真实的数据集已经发生了变化,但是A却查询不出来这种变化,因此产生了幻读。

这一种说法强调幻读在于某一个范围内的数据行变多或者是变少了,侧重说明的是数据集不一样导致了产生了幻读。

说法二:幻读并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:A事务select 某记录是否存在,结果为不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。产生这样的原因是因为有另一个事务往表中插入了数据。

理论上 幻读更应该是第二种说法:

因为在RR的隔离级别下, 本身就是一个快照读的方式, 只能读取到开启事务的时候的快照数据, 并不能读取到实时变化的数据, 所以第一种说法不认同.

第二种说法 认同, 正是因为快照读, 但是其他事物插入数据的时候是可以的, 但是当前事务又读取不到已经插入的数据, 但是去尝试插入数据就会有问题.

要想解决这个事务的 幻读 问题, 只能把数据库的事务的隔离级别调整到这个 可串行化,serializable。 (规避所有的并发问题,但是性能最低)

在这里插入图片描述

2. 存储引擎

通过查看建表语句, 可以看到会有一个默认的存储的引擎. innodb

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 InnoDB 存储引擎

在这里插入图片描述

在这里插入图片描述

也就是我们的数据是存储在 页 逻辑单元中的. 

在这里插入图片描述

Trx: 最后一次操作事务的id
Roll pointer: 
col1: 一个一个的字段的值

在innodb存储引擎中, 一个页是磁盘操作的最小单元,

一个Extent 的大小是固定的,是 1M ; 一个页的大小是16K

2.2 MyISAM存储引擎

在这里插入图片描述

sdi 是一个文本文件是可以直接打开的

2.3 Memory存储引擎

在这里插入图片描述

3种存储引擎的区别:

在这里插入图片描述

存储引擎的选择
在这里插入图片描述
在这里插入图片描述

3. 索引

3.1 索引简介

前言:
要知道系统中所有的动作都是放到内存中由CPU来执行处理的。 
所以我们的查询的操作也是如此,需要先把数据一部分一部分的加载到内存中然后由CPU执行比对操作,最后查询到我们所有需要的数据。

在这里插入图片描述

没有索引的时候,查询数据是进行一个全表的扫描。 当建立了索引之后,根据对应的字段建立索引。 如果是一个二叉树的索引结构, 那么比对查询的次数就是树高,已经会高效了很多。 基本已经不是一个数量级的了。

比如一个100万的数据,如果没有索引的话,我们需要比对100万次数据。

如果有这个索引的话,我们以建立二叉树的索引为例,那么建立100万的数据,需要的树高是:

设树高为 n : 100万 = 2^(n) -1 算出来大约 n= 20次, 也就是如果有建立一个索引, 那么查询的速度 只是比对20次左右.
在这里插入图片描述
在这里插入图片描述

3.2 索引结构

在这里插入图片描述
在这里插入图片描述

如果索引结构选择的是2叉树, 那么在插入数据的时候,如果数据是一个顺序的,那么就会形成一个链式结构。
在这里插入图片描述

也就是缺少一个自平衡的算法。

所以可以选择红黑树, --> 右侧

3.2.1 B Tree (B树: 多路平衡查找树)

在这里插入图片描述

B树,当每次插入进来第5个元素后, 都会发生中间的元素向上分裂。

阶数指的是:指针的个数,或者说是分支的最大个数。

3.2.2 B+ 树

在这里插入图片描述

可以看到不同的是:
1. 数据是存放到了叶子节点中
2. 叶子节点之间还形成了一个单向链表
3. 所有的节点都会出现在叶子节点, 非叶子节点只是起到了索引的作用

但是在mysql的B+树, 在B+树的基础上进行了扩展,将底部叶子节点的单向链表扩展为了双向链表。提高了区间访问的性能。
在这里插入图片描述

每一块数据都是存放到页中。

3.2.3 哈希

在这里插入图片描述
在这里插入图片描述

3.2.4 为什么InnoDB 选择B+树作为索引结构

在这里插入图片描述

1.聚集索引: 叶子结点存放的是该行的数据    
2.非聚集索引: 叶节点存放的是id值    

3.3 索引分类

在这里插入图片描述
在这里插入图片描述

首先这里要清楚,对于一张表,我们是可以有多个索引的。每一个索引会有2种选择,要么是聚集索引,要么是非聚集索引。
首先主键索引一定是一个聚集索引,且一张表中只有一个。 当然, 前提是这个表有主键,无论是单个字段的主键,还是多个字段的联合主键。其他的二级索引那就可以有很多个了。二级索引的叶子节点上的数据域存储的是主键的值,(一般是主键id的值)
那我们查询的时候是根据这个二级索引查找到对应的id,再在这个聚集索引中根据id找到对应的数据

在这里插入图片描述

优化sql :
在这里插入图片描述

针对于上面的两种两种sql 语句,很明显这个第一种的效率更高一些, 因为这个直接根据主键去查询的话,速度更快。
而根据name 的话需要进行一次回表的操作, 会慢一点。

在B+ 树的结构中, 每个结点时存放在这个页中的,而页的大小时固定的,为16K, 每个结点 存储的信息为 key , 以及指针。

这样的话,相比于B树,就可以存放更多的key, 这样可以提升IO 效率, 减少树的层级高度,提升搜索的效率。

相比于Hash索引,B+ 树 支持 范围匹配 以及 排序操作

对于这个唯一索引: 我们在创建这个唯一约束的时候, 会自动给我们创建一个唯一索引。 
主键也是, 默认会给创建一个主键索引。

3.4 索引语法

在这里插入图片描述

  • 创建索引

    CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name,... 列名) -- 列名不需要加这个""
    -- 如果在索引前不指定的话,那么创建的索引就是一个常规索引
    
  • 查看索引

    SHOW INDEX FROM table_name;
    
  • 删除索引

    DROP INDEX index_name ON table_name;
    
1: 这个索引名字一般是: idx_表名_字段名 
查询数据库的增删改查分别执行了多少次的语句
show global status like 'Com_______' -- Com 后面是跟了7个下划线。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. sql 性能分析

4.0 查询sql执行的频次

SHOW global status like 'Com_______';
-- 其中后面一个_ ,代表一个字符.

在这里插入图片描述

4.1 慢查询日志

因为我们不知道哪些sql的执行时间较长, 那么就可以通过慢查询日志来帮助我们定位到哪些sql的执行时间较长。
在这里插入图片描述
在这里插入图片描述

-- 开启慢日志查询 
set global slow_query_log=1; 
-- 修改慢日志记录SQL的最低阈值时间 
set global long_query_time=4;

在这里插入图片描述

对于慢查询sql 只会记录这个比设置的时间大的sql语句,

但是这个 其他的sql 的耗时, 我们可以通过这个 profile 进行查看, 需要开启 profiling, 然后就可以查看我们执行的每一条sql的耗时。

慢查询日志文件
在这里插入图片描述

通过慢查询日志找到我们的执行慢的sql

在这里插入图片描述

4.2 profile 详情

这个命令在mysql5.7以后就不推荐了

打开可以看到这个sql执行的耗时情况
在这里插入图片描述
在这里插入图片描述

4.3 explain 执行计划

explain: 的字段如下:
id: 查询语句的id
select_type:select 的类型
table: 表名
partitions:
type:连接类型
possible_keys:可能用到的索引
key: 实际用到的索引
key_len: 索引长度
ref:
rows:
filtered,
extra:在前面的select 后面如果不是查询 所有字段, 那么

【注意】 : explain 只能解释这个select 语句 !!!!
在这里插入图片描述

4.3.1 id

如果一个联合多表查询, 那么其中就会有多个执行的语句。 id相同,执行顺序从上到下, id值不同,值越大,越先执行。

在这里插入图片描述

4.3.2 select_type

查询类型:

SIMPLE: 简单表,即不使用表连接或者子查询

PRIMARY: 子查询中最外层查询, 查询中若包含任何复杂的子部分, 最外层的select被标记为primary

UNION:UNION 中的第二个或者后面的查询语句

SUBQUIRY:SELECT / WHERE 之后包含了子查询

4.3.3 type(非常重要的字段)

其中type字段:连接类型(null 是不扫描表)

最为常见的扫描方式有: (性能从上至下递减)

NULL: 当你不访问任何表的时候, type 是null , 所以一般业务系统中不太可能优化为null

在这里插入图片描述

  • system:系统表,少量数据,往往不需要进行磁盘IO;

  • const:常量连接;(主键或者唯一索引访问)
    在这里插入图片描述

  • eq_ref主键索引(primary key)或者 非空唯一索引 (unique not null)等值扫描;

  • ref:非主键 非唯一索引 等值扫描; (非唯一索引)
    在这里插入图片描述

  • range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween、、in等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引

  • index:Full Index Scan,index 与 ALL 区别为index类型只遍历索引树。这通常为ALL块,因为 索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)

  • ALL:全表扫描(full table scan);

如果查询的是主键或者唯一索引,那么速度是要优于普通索引的

在这里插入图片描述

4.3.4 possible_key

显示可能应用在这张表上的索引, 一个或多个。

4.3.5 key_len

表示索引中使用的字节数, 该值为索引字段最大可能长度, 并非实际使用长度, 在不损失精确性的前提下, 长度越短越好。

此列显示MySQL在索引里使用的字节数,通过此列可以算出具体使用了索引中的那些列。索引最大长度为768字节,当长度过大时,MySQL会做一个类似最左前缀处理,将前半部分字符提取出做索引。当字段可以为null时,还需要1个字节去记录。

​ key_len计算规则:

​ 字符串:

​ char(n):n个数字或者字母占n个字节,汉字占3n个字节

​ varchar(n): n个数字或者字母占n个字节,汉字占3n+2个字节。+2字节用来存储字符串长度。

​ 数字类型:

​ tinyint:1字节 smallint:2字节 int:4字节 bigint:8字节

​ 时间类型

​ date:3字节 timestamp:4字节 datetime:8字节

4.3.6 rows

MYsql认为必须要执行的查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。

4.3.7 filtered

表示返回结果的行数占需读取行数的百分比,filtered的值越大越好

在这里插入图片描述

4.4 联合索引

如果给一个表添加多个单列索引, 和给多个字段添加这个联合索引

单列索引的,查询时, 只会走其中一个索引。 在数据量比较大的时候,联合索引更加有优势。

联合索引失效的情况:

最左前缀法则:

就是在建立了联合索引后,我们查询时的where条件中的 必须要有最左侧的字段的条件,但是与我们where的条件的顺序是没有关系的。

字符串类型的数据查询时, 需要加上单引号, 或者双引号.

在这里插入图片描述
在这里插入图片描述

  • 数据分布影响

    如果MySQL评估使用索引比全表更慢, 则不使用索引。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

所以走不走索引也会取决于表中数据的分布。

1:没有遵循最左前缀法则
2:中间有跳跃,那么跳跃后的部分索引失效
3:在索引字段上出现范围查询,范围查询右侧(右侧是指建立的联合索引的顺序)的列索引失效。  
(如果是使用这个 > , 右侧会失效;但是使用>= , 则不会失效,很迷)
4:在索引列上进行运算操作, 索引会失效
5:字符串类型字段使用时,不加引号,索引将失效
6:模糊查询时,头部模糊查询时,索引会失效 ( like %key% , like %key ) 索引会失效,(like key% ) 索引不会失效
7:查询条件中,使用 or 关键字,如果有一侧的条件字段中没有索引,那么会使索引失效
4.4.1 SQL 提示
如果对应于某一个字段既有单列索引,又有联合索引的情况,我们可以人为的指定要走什么索引 , 整个提示是我们给mysql提示
use index(索引名) , 这个是建议, mysql 自己会再做一个评估
force index(索引名) , 这个是强制的 必须走这个索引

在这里插入图片描述

4.4.2 覆盖索引

【回表】

如果我们查询的字段刚好 , 这个字段有索引的话, 那么就不会回表,提高效率

比如下图: 表的 id , name, 这两个字段我们都有索引,那么根据name 去查询的时候, 如果 select id,name 那么会直接返回结果,不用回表。

但是如果其中存在这个没有索引的字段,那么就需要一次回表的操作
在这里插入图片描述
在这里插入图片描述

覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
注意:
a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select *
b、如果将所有字段都建索引会导致索引文件过大,反而降低crud性能

4.4.3 前缀索引
目的: 有些字段比较长的字符串,我们可以给它建立部分的索引, 从而降低索引的体积,提高查询的效率

了解一下即可:

前缀的长度可以根据索引的选择性来决定

在这里插入图片描述

【查询过程】

在这里插入图片描述

4.4.4 索引选择

推荐尽量使用联合索引, 避免使用单列索引

使用覆盖索引,还可以避免回表查询。 提升效率

在这里插入图片描述

4.4.5 索引设计原则

在这里插入图片描述

4.4.6 索引失效

在 MySQL 中,索引失效的情况有多种,以下是一些常见的索引失效情况:

  1. 不满足最左前缀原则:在使用联合索引时,查询条件需要按照索引中定义的字段顺序进行匹配,如果顺序不匹配,索引可能失效 。
  2. 索引列上有计算:如在 WHERE 条件中对索引列进行加1操作,会导致索引失效,因为数据库需要先进行计算再进行索引查找 。
  3. 索引列使用了函数:例如使用 SUBSTR() 函数处理索引列,会导致索引失效,因为索引系统无法应用于函数的结果 。
  4. 字符类型没加引号:如果索引列是字符类型,但在查询时没有使用引号,会导致类型不匹配,索引失效 。
  5. 使用了 LIKE 查询:当 LIKE 查询的条件以 % 开头,如 '%value',索引将失效,因为这种模式无法有效使用索引进行查找 。
  6. 使用 IS NULLIS NOT NULL:如果字段不允许为空,使用 IS NULLIS NOT NULL 作为查询条件时,索引可能失效 。
  7. 使用了 OR 条件:如果 OR 两边的条件中只有一边有索引,索引可能失效 。
  8. 使用了 SELECT *:使用 SELECT * 可能会让索引失效,因为可能需要回表查询非索引列,如果查询的列都是索引列,则可以使用覆盖索引
  9. 索引列参与了类型转换:如在查询条件中将数值类型与字符类型进行比较而没有进行适当的类型转换,会导致索引失效 。
  10. 使用了 NOT INNOT EXISTS:这些操作可能会导致索引失效,尤其是当 NOT IN 子句中的列表较大时 。
  11. ORDER BY 索引字段顺序不当:如果 ORDER BY 子句中的字段顺序与索引定义的顺序不一致,或者 ORDER BY 涉及到多个索引,可能会导致索引失效 。
  12. 列对比操作:在查询条件中对两个索引列进行比较,如 id = height,可能会导致索引失效 。
  13. Mysql优化器的决策:在某些情况下,MySQL 优化器可能认为全表扫描比使用索引更快,因此会放弃使用索引 。

以上是一些常见的索引失效情况,但请注意,索引的使用和效果可能会受到 MySQL 版本和具体查询负载特性的影响。在实际应用中,应使用 EXPLAIN 命令来分析查询语句是否真的使用了索引,并根据具体情况进行优化。

5.SQL 优化

5.1插入数据优化
  • 如果是插入多条数据,最好不要使用这种一次插入一条的方式

在这里插入图片描述

可以使用一次插入多条的方式

在这里插入图片描述

  • 如果是一次性插入大量的数据,使用insert 语句性能比较低,此时可以使用MySQL数据库提供的load 指令进行插入。
    在这里插入图片描述

一次导入几百万的数据 大概几十秒的时间。

1百万的数据 只花费了7.56秒, 非常快。

5.2 主键优化

在这里插入图片描述

主键乱序插入的话,会发生页分裂的情况,效率比较低。

在这里插入图片描述
在这里插入图片描述

在删除某一行数据时, 当删除到一定的数据时,可能发生页合并。

在这里插入图片描述

5.3 主键设计原则

在这里插入图片描述

5.4 limit优化

使用 覆盖索引 + 子查询的方式来查询,可以提高性能。

原来: select * from tb_sku limit 100000,10  -- 查询从100000 后的10条数据
采用覆盖索引: 
select * from tb_sku t,(select id from tb_sku) s where t.id = s.id; -- 但是这种方式, 这个id必须是要自增的吧, 不然查出来还是不一致。这里为啥要 order by 呢 ?   

在这里插入图片描述

5.5 update 优化

在mysql 的默认的隔离级别下:

事务A 对这个id = 1的数据进行 update, 事务B 在想进行update 操作的时候,就不可以了。 但是可以读数据。

在事务A读数据的时候,事务B 是可以进行一个写操作的。

事务A 对 这个没有加索引的字段作为条件进行更新,是会锁住整张表的。

此时事务B再想进行一个操作的时候,是会被阻塞住的。

针对于这个行锁的是 where 条件是这个 创建了索引的字段。

避免这个由行锁升级为表锁~

5.6 优化总结

在这里插入图片描述

6. 锁

按照锁的粒度分为一下三类:

1.全局锁: 锁定数据库中的所有表
2.表级锁: 每次操作锁住整张表
3.行级锁: 每次操作锁住对应的行数据
6.1 全局锁

在这里插入图片描述

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于这个只读状态, 后续的DML的写语句,DDL语句, 都会处于一个阻塞的状态。其典型的使用场景就是做全库的逻辑备份, 对所有的表进行锁定,保证这个数据的一致性以及数据的完整性。(一致性:  比如有两张表,订单表,库存表) 可能会得到备份的数据不一致的问题。   就是这个订单表里面有这个数据, 但是备份的库存没有扣减。  也就是这个数据不一致的问题。 

一般在执行这个数据备份的时候,会先给这个数据库加全局锁。

flush talbes with read lock; 加锁

unlock tables;解锁

【注意】mysqldump 这个语句是直接在Windows 命令行中执行的, 并不是sql 语句.

在innoDB 引擎中,我们可以在备份时加上参数-- single-transaction 参数来完成不加锁的一致性数据备份 。

mysqldump -h:IP+端口 --single-transaction -uroot -p1234 数据库名 >  存放的路径
6.2 表级锁

分为以下3类:

1.表锁

2.元数据锁

3.意向锁

6.2.1 表锁(要自己去加锁)

DDL: 对 表结构 进行更改的操作

DML: 对表中数据进行更改的操作

DQL: 对表中数据进行查询的操作

需要显示地写这个 加解锁的语句。

查询表的锁的语句:

select * from performance_schema.metadata_locks;

在这里插入图片描述

1; 对于 【读锁】; 
本客户端和其他客户端是可以读, 但都不可以写.
lock tables 表名 read;
unlock tables;2; 对于 【写锁】;
本客户端可以读写, 其他客户端不可以读和写.
lock tables 表名 write;
unlock tables;
6.2.2 元数据锁 (不用自己去加)

DDL 是对这个表结构的更改, DML是对这个数据的更改。

**目的:**为了维护数据的一致性,当这个表上面有这个事务的时候,是不可以对表中的数据进行写入操作的 。 避免DML 和 DDL 发生冲突,从而导致这个数据不一致的问题。

在这里插入图片描述

6.2.3 意向锁🔒 (不需要手动地去添加)

在没有引入这个意向锁之前,在每次进行添加表锁的时候, 需要检查一遍整张表, 查看是否已经被上了这个行锁, 如果没有上锁,那么可以直接加锁; 如果上锁了,需要判断行锁🔒的类型,来确定是不是可以成功加锁,效率比较低。 一行一行的来检查的。

为了提高效率, 引入了意向锁。

同样,比如线程A 给表中的某一条数据加了这个行锁,紧接着会给整张表加一个意向锁🔒,那么此时线程B要对这个表来执行一个加表锁🔒的操作,它会首先来检查这个意向锁的情况, 然后来判断当前的意向锁是否与这个表锁兼容。

引入意向锁之后,在加这个表锁的时候,就不用去逐行检查这个行锁,直接根据意向锁,以及意向锁的类型来判断当前的表锁是否可以加锁成功。

在这里插入图片描述

0:如果直接执行这个 select * from user where id =1; 是不会加任何锁的。 1; 意向共享锁(IS): 由语句 select ... lock in share mode 添加   -- 这个加意向共享锁的同时,也是一个加这个共享读锁的过                                                           程。 也就是说加这个行级锁的读锁,同时会加一把意向共享锁与表锁共享锁(read) 兼容,与表锁排它(write)锁互斥.在执行这个 update ,insert,delete 语句的时候,mysql 会自动为这个语句加上一个行锁(for update)(排他锁,同时也是一个意向排他锁) 
2; 意向排他锁(IX): 由 insert ,update,delete,select ...  for update 添加与表锁共享锁(read)及排它锁(write) 都互斥.   意向锁之间是不会互斥的

在这里插入图片描述

6.3 行级锁.

在这里插入图片描述

锁的粒度: 从小到大: 分别是: 行锁 --> 间隙锁 --> 临键锁 (最大)

行锁🔒也叫记录锁

在这里插入图片描述

也就是说: 间隙锁, 如果你在 select 语句中 添加了 锁: 排它锁 / 共享锁

比如有一张source 表:
在这里插入图片描述

事务A:
begin;
select * from source where id > 8 lock in share mode;

我在查询的时候, 加了锁, 并且不是一个等值查询, 是一个范围查询, 那么会向id > 8 的所有数据添加一个 间隙锁🔒

事务A查询结果:

在这里插入图片描述

此时执行事务B: 看下结果

事务B:
begin;
insert source VALUES(10,'天南海北','10',10,'哒哒哒',null,null);

在这里插入图片描述

可以看到的是, 插入数据是无法插入数据的. 因为在查询的时候给加了 临键锁🔒

innodb 默认是走行级锁, 如果所要查询的条件字段没有加索引的话, 那么会上升为表级锁。

在这里插入图片描述

  解释一下: 1. 共享锁: 一个事物A中, 对于select语句 加了共享锁 , 那么另一个事物如果是共享锁那么是可以读取到加了锁的数据的, 但是对于是加了排它锁的语句, update, insert, delete 语句是会直接不允许获取这些数据的, 一直处于一个等状态的.  2. 排它锁: 锁的力度更大. 只要有一个事物对于这块儿的数据,加了锁, 那么别的锁都会互斥, 无论是排它锁还是共享锁. 【注意】 虽然在排他锁是会对其他锁是有互斥的, 但是不开事物的select 语句, 是可以直接查询到数据的。
6.3.1 行锁🔒

在这里插入图片描述

所以意思是: 我们执行这个增删改的时候, 会自动加上这个 排他锁

但是如果我们执行这个普通的 select 语句的时候, 默认是没有加任何🔒的, 如果要加一个共享锁, 我们需要自己来加一个

 select 语句 + lock in share  mode-- 共享锁 

那么可以达到在一个线程对这个数据进行读的时候, 其他线程不可以对该数据进行更改~

6.3.2 间隙锁🔒 + 临键锁🔒

在这里插入图片描述

情况1: 索引上的等值查询,唯一索引,且查询的记录不存在的数据, 那么这个临键锁 会优化为这个 间隙锁。

在这里插入图片描述

那这个应该是 where id = 5 ; 唯一索引, 和这个 是 select 语句,还是这个 insert,update,delete 语句没有关系吧 ~

总之, 是 唯一索引, 且 不存在这个值, 那么就会给添加这个间隙🔒。

情况2:索引上的等值查询(普通索引),向右遍历到最后一个值不满足查询需求时, 临键锁会退化为这个间隙锁。

比如我现在一个用户表中,有一个age 年龄字段, 我建立的是一个普通索引。 那么我现在搜索这个年龄 = 18 岁的人

在这里插入图片描述

情况3:索引上的范围查询, (唯一索引)会访问到不满足条件的第一个值为止

比如查询 id>= 9;

那么会把这个id=9 这行数据以及之后的这些数据都锁起来。

7. 逻辑存储结构

在这里插入图片描述

在这里插入图片描述

8.1 内存架构

Buffer Pool

在这里插入图片描述

Change Buffer

在这里插入图片描述

自适应哈希索引

在这里插入图片描述

Log Buffer

在这里插入图片描述

8.2 磁盘结构

在这里插入图片描述

8.4 后台线程

在这里插入图片描述

9.事务原理

在这里插入图片描述

8.1 redolog 重做日志

这个脏页就是这个修改后的数据 。
在这里插入图片描述

发生数据的变更的时候, 会首先把数据的变化提交到这个Redolog Buffer 中。 然后当事务提交的时候,它会把这个Redolog Buffer 中的数据变化直接刷新到磁盘中,持久化的保存到磁盘文件中。 
然后,在后面执行这个脏页刷新的时候,如果出错了,那么会使用这个 redolog file  文件进行一个数据的恢复~  
在每次提交事务的时候,会把这个数据的变更提交到 Redolog Buffer 中,并且刷新到磁盘中, 属于日志追加文件redolog  是日志追加的方式, 是顺序磁盘IO,性能要高于 直接每次把这个事务提交的数据改变直接刷新到这个磁盘中的随机IO如果脏页顺利地刷新到了磁盘中,那么这个redolog file 文件也就不需要了。 每隔一段时间就回去清理redolog 日志文件~  总之:  redolog 的作用就是在将脏页数据刷新到磁盘中出错的时候,进行一个数据的恢复,从而保证一个数据的持久化~   
8.2 undolog 回滚日志

在这里插入图片描述

当要进行一个数据的回滚的时候, 只要执行undolog 日志文件的反向操作的日志,便可以使数据恢复到之前的版本。

9. MVCC 基本原理

多版本并发控制 ~

在这里插入图片描述

所谓隐藏字段: 就是我们在创建一张表的时候会自动给我们添加上的字段,隐式地添加上 2-3个字段。
前2个字段是默认都会添加的,但是最后一个字段是如果表结构没有指定主键的话,那么会为该表生成一个主键字段。

【注意】

对于这个当前读中, 根据这个不同的隔离级别, 快照读也是不一样的。

在RC 隔离级别下: 每一次 的select 语句都会 生成一个 快照读。 就像是对当前的数据的版本进行了一个保存~

在RR 隔离级别下:是开启事务后的第一个 select 语句 是 开始快照读的地方。

在串行化的隔离级别下: 就相当于只有这个当前读了。

【注意2】

对于这个当前读: 在读取该数据的时候会对数据进行一个加锁的操作~ 保证并发事务不可以修改当前记录, 那么这个相当于也是读取到的这个一个旧的版本的数据了?

至于这个 RR隔离级别下: 就是读取还是读取的是这个旧版本的数据, 但是这个其他事务是可以对当前的记录进行一个修改的操作的。

在这里插入图片描述

刚开始插入数据:

DB_TRX_ID : 这个字段最开始插入一条数据,是初始值为1, 自增的

DB_ROLL_PTR :null , 没有回滚的指针

查看表空间具体信息字段:

ibd2sdi + 表空间文件名 ~

在这里插入图片描述
在这里插入图片描述

存在有未提交的事务在使用该记录, 所以undolog 不会被删除 ~

9.1 undolog版本链:

在这里插入图片描述

9.2 readview

在这里插入图片描述
在这里插入图片描述

那总结下来: 就是这个当前事务的 i d 只要是 <= max_trx_id , 就可以访问到该版本的数据。 而且是已经提交过的数据才可以访问到的

当前这条事务记录的id , 就是这个 DB_TRX_ID , 这个是只有对数据进行了修改的事务,才会有事务id。
在这里插入图片描述

【分析】

我们来分析一下事务5的查询的记录到底是啥?

首先当前记录的 事务 id 是 4, creator_trx_id = 5, max_trx_id = 5+1=6, min_trx_id = 3 ,

根据上面的 4 个条件进行一一判断,发现无法查询到当前记录的版本, 因为其实我们可以看到在此时, 只有这个事务2对该事务进行了提交, 所以按照这个已提交读的隔离级别或者是 RR 级别下, 我们可以访问到的数据只能是这个 事务2 提交后的数据, 应该是这个

age= 3, name = A30 。

我们接着按照这个规则进行判断在这里插入图片描述

该记录无法查询到, 那么根据 undolog 版本链规则, 我们可以继续往下走, DB_ROLL_PTR —> OX0003 ,可以看到这个

当前数据记录的事务的id 为 3 , 发现不符合规则 4 。 同样, 因为事务3 并没有提交, 该条记录是 事务3 提交后的数据。

那么接下再根据 DB_ROLL_PTR —> OX0002 , 找到对应的版本数据, 可以发现这个 当前记录中事务的id 是 2 , 是符合这个要求的, 也就是在事务5中的 第一个select 语句 可以查询到的数据。

那么, 同理, 对于在这个事务5中的第2个select 语句 就是这个 在该语句之前提交的 语句了。 对应的因该是事务3提交的数据。

每次 select 语句都会有一个快照读的版本。 这个对应的应该是这个RC 隔离级别下。

**活动事务: **是指在当前的时间结点上, 还有这个对该事务进行读或者写的事务。
在这里插入图片描述

那么因为 RR 隔离级别下: 我们要保证的是这个在一次事务中, 两次select 语句要查询到的语句都是一样的 , 所以这个是 以 本事务中的第一个 select 为 开始时间结点的判断。 当前读是读取到的可能是这个旧数据。 也就是在此期间, 其他事务是可以修改数据的, 但是我只能读取到这个事务开始之前的最新的版本的数据。 但是这个事务开启之后的版本的数据事务读取到的。

如果是这个当前读: 通过加锁的方式, 我们对数据进行了加锁,不让其他事务对当前事务进行修改, 那么其实也可以说, 我们读取到的是这个最新的数据。

在这里插入图片描述

来分析一下事务的隔离级别的实现:

【快照读】

① 未提交读:

运维篇

数据库设计三范式

在这里插入图片描述

第一范式:

在这里插入图片描述

第二范式:

在这里插入图片描述

因为仔细看一下, 上面的这张表 其实应该设计为一个多对多的关系的表~   不应该挤到一张表中。 
那么应该设计如下:  应该设计为3张表~ 

在这里插入图片描述

多对多怎么设计?

【多对多,三张表,关系表两个外键!!!!!! 】

第三范式:

在这里插入图片描述

在上面的表中, 很明显 , 班级名称发生了冗余。  一个班级 对应 多个学生。  是一个 一对多 的关系。
应该将其拆分为2张表。 我们需要在多的一方添加一个外键~  口诀:一对多,2张表,多的表加外键! 

此处有疑问: 外键 和外键约束的关系?

一对一: 外键唯一, 也是分为2张表, 外键设置为唯一

在这里插入图片描述

总结:

在这里插入图片描述
冲 !!!!!!

相关文章:

MySQL-学习笔记

基础篇 sql字段 1. date 类型 date类型用于存储日期值&#xff0c;格式为’YYYY-MM-DD’&#xff0c;显示范围是从’1000-01-01’到’9999-12-31’。它只包含日期部分&#xff0c;不包含时间部分。 2.datetime 类型 datetime类型用于存储日期和时间值&#xff0c;格式为’Y…...

HarmonyOS4+NEXT星河版入门与项目实战(19)------状态管理 @Prop@Link@Provide@Consume

文章目录 1、@Prop@Link@Provide@Consume装饰器图解2、案例演示1、模块划分2、模块封装1、任务统计模块2、列表管理模块3、主界面4、完整代码3、父组件是对象@Prop可以是对象属性1、案例改造2、完整代码4、@Provide@Consume案例1、案例改造2、完整代码3、总结1、@Prop@Link@Pro…...

企业OA管理系统:Spring Boot技术实现与案例研究

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…...

react

proTable manualRequest:实现初次进入不查询调用接口,当点击搜索调价查询才调用接口 form{{ ignoreRules: false }} 在搜索条件上增加必选项 formItemProps: { rules: [{required: true,message: 请选择结束时间}] },需要在proTable中增加form{{ ignoreRules: false }}才生效…...

【VTK】MFC中使用VTK9.3

MFC中如果使用VTK 碎碎念一、vtk环境配置二、具体实现1、新建类2. 自定义控件3、跑个栗子 总结 碎碎念 如果不是老程序用的MFC&#xff0c;我才不想用MFC去使用VTK呢。 一、vtk环境配置 关于环境配置你可以看这篇文章&#xff0c;在这里不过多赘述。需要注意要选择支持MFC&a…...

mysql系列1—mysql架构和协议介绍

背景&#xff1a; 本文开始整理mysql相关的文章&#xff0c;用于收集数据库相关内容&#xff1b;包括mysql架构和存储方式、索引结构和查询优化、数据库锁等内容。思考如何根据具体的业务给出最优的分表规划和表设计、字段选择和索引设计、优化的SQL语句&#xff0c;以及数据库…...

美创科技入选2024数字政府解决方案提供商TOP100!

11月19日&#xff0c;国内专业咨询机构DBC德本咨询发布“2024数字政府解决方案提供商TOP100”榜单。美创科技凭借在政府数据安全领域多年的项目经验、技术优势与创新能力&#xff0c;入选收录。 作为专业数据安全产品与服务提供商&#xff0c;美创科技一直致力于为政府、金融、…...

Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…...

Vue实训---1-创建Vue3项目

0-在VSCode中的终端中运行npm -v查看版本号 如果出现——“npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。……”的错误&#xff0c;则需要在 vscode 终端执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 命令即可。…...

设计模式之观察者模式

背景 假如我们现在有这样一个场景&#xff1a;市场上的股票价格不定时变化&#xff0c;而后台监控者和广告想要实时获取股票信息&#xff0c;我们应该怎么做&#xff1f; 显然在这个场景里&#xff0c;我们有这样一个设计 一个股票类不时更新股票价格另外有两个类Monitor和Bi…...

Vue.js 学习总结(13)—— Vue3 version 计数介绍

前言 Vue3.5 提出了两个重要概念&#xff1a;version计数和双向链表&#xff0c;作为在内存和计算方面性能提升的最大功臣。既然都重要&#xff0c;那就单挑 version 计数来介绍&#xff0c;它在依赖追踪过程中&#xff0c;起到快速判断依赖项有没有更新的作用&#xff0c;所以…...

数据结构 ——— 直接选择排序算法的实现

目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现&#xff08;默认升序&#xff09; 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…...

初始Python篇(5)—— 集合

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 集合 相关概念 集合的创建与删除 集合的操作符 集合的相关操作方法 集合的遍历 集合生成式 列表、元组、字典、集合的…...

基于Qt/C++/Opencv实现的一个视频中二维码解析软件

本文详细讲解了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件。代码实现了视频解码、多线程处理和界面更新等功能&#xff0c;是一个典型的跨线程图像处理项目。以下分模块对代码进行解析。 一、项目的整体结构 项目分为以下几部分&#xff1a; 主窗口 (M…...

图片生成视频-右进

右侧进入 ffmpeg -loop 1 -i image.jpg -f lavfi -i colorcblack:s1280x720:d20 -filter_complex "[1:v]formatrgba[bg];[0:v]formatrgba,scale1280:720[img];[bg][img]overlayxif(lt(t,3),W,if(lt(t,8),W-(t-3)*W/5,0)):y(H-h)/2:enablegte(t,3)" -c:v libx264 -t 2…...

Golang的语言特性与鸭子类型

Golang的语言特性与鸭子类型 前言 什么是鸭子类型&#xff1f; Suppose you see a bird walking around in a farm yard. This bird has no label that says ‘duck’. But the bird certainly looks like a duck. Also, he goes to the pond and you notice that he swims l…...

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0&#xff1a;构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布&#xff0c;我们迎来了许多新特性和改进&#xff0c;其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…...

Centos-stream 9,10 add repo

Centos-stream repo前言 Centos-stream 9,10更换在线阿里云创建一键更换repo 自动化脚本 华为centos-stream 源 , 阿里云centos-stream 源 华为epel 源 , 阿里云epel 源vim /centos9_10_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.h...

手机发展史介绍

手机&#xff0c;这个曾经在电影和科幻小说中出现的高科技产品&#xff0c;如今已经渗透进了我们生活的每个角落。从单纯的通讯工具到如今集成了通讯、娱乐、工作、社交等多种功能的智能终端&#xff0c;手机的发展史也是人类科技进步的缩影。本文将从手机的发展历程、技术革新…...

七天掌握SQL--->第五天:数据库安全与权限管理

1.1 用户权限管理 用户权限管理是指控制用户对数据库的访问和操作权限。在MySQL中&#xff0c;可以使用GRANT和REVOKE命令来管理用户权限。 GRANT命令用于授予用户权限。语法如下&#xff1a; GRANT privileges ON database.table TO userhost IDENTIFIED BY password;其中&…...

Oracle-表空间/用户的创建与使用

-- 对象 -- 需要create的都是对象 已学的对象&#xff1a;表 table -- 普通用户 只能查询user开头的数据字典 select tablespace_name from user_tablespaces; -- dba用户才能够查询 select tablespace_name from dba_tablespaces; -- 创建表空间&#xff08;需要管理员…...

生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

PAMAP2数据集是一个包含丰富身体活动信息的数据集&#xff0c;它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始&#xff0c;逐步引导大家通过数据分割、预处理、模型训练&#xff0c;到最终的性能评估&#xff0c;在接下来的章节中&#xff0c…...

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型&#xff08;LLMs&#xff09;在处理表格数据时的微调优化策略。具体来说&#xff0c;论文探讨了以下…...

卡达掐发展史

自行车是一种简单而又伟大的交通工具。自从19世纪诞生以来&#xff0c;它不仅改变了人们的出行方式&#xff0c;也深刻地影响了我们的生活方式、城市布局以及健康观念。作为一种绿色、经济的出行工具&#xff0c;自行车至今仍在全球范围内被广泛使用。本文将从自行车的历史、结…...

初学 flutter 问题记录

windows搭建flutter运行环境 一、运行 flutter doctor遇到的问题 Xcmdline-tools component is missingRun path/to/sdkmanager --install "cmdline-tools;latest"See https://developer.android.com/studio/command-line for more details.1&#xff09;cmdline-to…...

大数据实验4-HBase

一、实验目的 阐述HBase在Hadoop体系结构中的角色&#xff1b;能够掌握HBase的安装和配置方法熟练使用HBase操作常用的Shell命令&#xff1b; 二、实验要求 学习HBase的安装步骤&#xff0c;并掌握HBase的基本操作命令的使用&#xff1b; 三、实验平台 操作系统&#xff1…...

CentOS:A服务器主动给B服务器推送(上传),B服务器下载A服务器文件(下载)

Linux:常识(bash: ip command not found )_bash: ip: command not found-CSDN博客 rsync 中断后先判断程序是否自动重连:ps aux | grep rsync 查看目录/文件是否被使用(查询线程占用):lsof /usr/local/bin/mongodump/.B_database1.6uRCTp 场景:MongoDB中集合非常大需要…...

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素&#xff1a; 性能需求。根据网站的预期流量和负载情况&#xff0c;选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构&#xff0c;以便…...

el-table最大高度无法滚动

解决el-table同时使用fixed和计算的最大高度时固定右边的列无法跟随滚动的问题 原因&#xff1a;el-table组件会根据传入的 max-height 计算表格内容部分 和 fixed部分的最大高度&#xff0c;以此来生成滚动条和产生滚动效果&#xff0c;当传入的 max-height 为一个计算的高度…...

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector

《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…...

如何使用 Python 开发一个简单的文本数据转换为 Excel 工具

目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件: 读取TSV文件: 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的日常工作中,我们经常…...

全卷积网络(Fully Convolutional Networks, FCN)

全卷积网络&#xff08;Fully Convolutional Networks, FCN&#xff09; 什么是 FCN&#xff1f; 全卷积网络&#xff08;Fully Convolutional Networks, FCN&#xff09;是一种用于图像语义分割的深度学习模型。与传统的卷积神经网络&#xff08;CNN&#xff09;不同&#x…...

【计算机网络】HTTP协议

一、网址 1.URL URL就是我们平时说的网址 2.urlencode/urldecode 像 / ? : 等这样的字符&#xff0c;已经被url当做特殊意义理解了。因此这些字符不能随意出现 如果某个参数中需要带有这些特殊字符&#xff0c;就必须先对特殊字符进行转义 -> urlencode 服务器收到url…...

IT服务团队建设与管理

在 IT 服务团队中&#xff0c;需要明确各种角色。例如系统管理员负责服务器和网络设备的维护与管理&#xff1b;软件工程师专注于软件的开发、测试和维护&#xff1b;运维工程师则保障系统的稳定运行&#xff0c;包括监控、故障排除等。通过清晰地定义每个角色的职责&#xff0…...

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 &#xff08;1&#xff09;内部SRAM &#xff08;2&#xff09;内部闪存存储器 &#xff08;3&#xff09;AHB到APB的桥&#xff08;AHB to APBx&#xff09; 2、四个主动&#xff08;驱动&#xff09;单元 &#x…...

C++自动化测试:GTest 与 GitLab CI/CD 的完美融合

在现代软件开发中&#xff0c;自动化测试是保证代码质量和稳定性的关键手段。对于C项目而言&#xff0c;自动化测试尤为重要&#xff0c;它能有效捕捉代码中的潜在缺陷&#xff0c;提高代码的可维护性和可靠性。本文将重点介绍如何在C项目中结合使用Google Test&#xff08;GTe…...

Python 虚拟环境使用指南

Python 虚拟环境使用指南 博客 一、创建虚拟环境 在开始使用Python虚拟环境之前&#xff0c;我们需要先创建一个新的虚拟环境。 1. 基础创建流程 首先&#xff0c;进入您的项目目录&#xff1a; cd path\to\your\project然后使用以下命令创建虚拟环境&#xff1a; pytho…...

MySQL面试-1

InnoDB中ACID的实现 先说一下原子性是怎么实现的。 事务要么失败&#xff0c;要么成功&#xff0c;不能做一半。聪明的InnoDB&#xff0c;在干活儿之前&#xff0c;先将要做的事情记录到一个叫undo log的日志文件中&#xff0c;如果失败了或者主动rollback&#xff0c;就可以通…...

Harbor2.11.1生成自签证和配置HTTPS访问

文章目录 HTTPS的工作流程部署Harbor可参考上一篇文章生成自签证书1.修改/etc/hosts文件2.生成证书a.创建存放证书路径b.创建ca.key密钥c.创建ca.crtd.创建给Harbor服务器使用密钥 yunzhidong.harbor.com.keye.创建给Harbor服务器使用证书签名请求文件 yunzhidong.harbor.com.c…...

鸿蒙开发Hvigor插件动态生成代码

Hvigor允许开发者实现自己的插件&#xff0c;开发者可以定义自己的构建逻辑&#xff0c;并与他人共享。Hvigor主要提供了两种方式来实现插件&#xff1a;基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。 基于hvigorfile脚本…...

VSCode 新建 Python 包/模块 Pylance 无法解析

问题描述&#xff1a; 利用 VSCode 写代码&#xff0c;在项目里新建一个 Python 包或者模块&#xff0c;然后在其他文件里正常导入这个包或者模块时出现&#xff1a; Import “xxxx” could not be resolved Pylance (reportMissingImports) 也就是说 Pylance 此时无法解析我们…...

【论文笔记】Number it: Temporal Grounding Videos like Flipping Manga

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Number it: Temporal Grou…...

【C++】list模拟实现(详解)

本篇来详细说一下list的模拟实现&#xff0c;list的大体框架实现会比较简单&#xff0c;难的是list的iterator的实现。我们模拟实现的是带哨兵位头结点的list。 1.准备工作 为了不和C库里面的list冲突&#xff0c;我们在实现的时候用命名空间隔开。 //list.h #pragma once #…...

Java基础-组件及事件处理(下)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 面板组件 说明 常见组件 JScrollPane常用构造方法 JScrollPane设置面板滚动策略的方法 JScrollPane滚…...

太通透了,Android 流程分析 蓝牙enable流程(应用层/Framework/Service层)

零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0c;加上网络上其实没有一个完整的介绍Bluedroid系列的文档&#xff0…...

《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗&#xff0c;温度升高芯片失效率也会增加&#xff0c;增加散热片或风扇会增加整体重量和成本&#xff0c;在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支&#xff0c;产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…...

【Ubuntu24.04】服务部署(虚拟机)

目录 0 背景1 安装虚拟机1.1 下载虚拟机软件1.2 安装虚拟机软件1.2 安装虚拟电脑 2 配置虚拟机2.1 配置虚拟机网络及运行初始化脚本2.2 配置服务运行环境2.2.1 安装并配置JDK172.2.2 安装并配置MySQL8.42.2.3 安装并配置Redis 3 部署服务4 总结 0 背景 你的服务部署在了你的计算…...

Java基础-组件及事件处理(中)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 BorderLayout布局管理器 说明&#xff1a; 示例&#xff1a; FlowLayout布局管理器 说明&#xff1a; …...

从零开始学习数据库 day0(基础)

在当今的信息时代&#xff0c;数据已经成为了企业和组织最重要的资产之一。无论是电子商务平台&#xff0c;社交媒体&#xff0c;还是科研机构&#xff0c;几乎每个地方都离不开数据库。今天&#xff0c;我们将一起走进数据库的世界&#xff0c;学习它的基础知识&#xff0c;帮…...

【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?

博客主页&#xff1a; [青松] 本文专栏: NLP 大模型百面百过 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方&#xff1f;为什么&#xff1f; 重要性&#xff1a;★★★ &#x1f4af; 本题主要考察面试者对以下问题的理解&#xff1a; ① 数据特征和模…...