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

存储引擎、索引(MySQL笔记第四期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解

目录

  • 存储引擎概念
    • InnoDB存储引擎
    • MyISAM存储引擎
    • Memory存储引擎
    • 存储引擎的选择
  • 索引
    • 三种索引
    • 索引分类
    • 语法(创建/查看/删除)
    • 性能分析工具
      • SQL执行频率
      • 慢查询日志
      • profile详情
      • explain执行计划
    • 索引的使用规则(及失效情况)
      • 最左前缀法则
      • 范围查询失效情况
      • 索引列运算
      • 字符串不加引号
      • 模糊查询
      • or连接的条件
      • 数据分布的影响
      • SQL提示
      • 覆盖索引
      • 前缀索引
      • 单列索引/联合索引
      • 索引设计原则

存储引擎概念

在这里插入图片描述

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式,存储引擎是基于表的,而不是基于库的,所以一个库里的多张表可能使用不同的存储引擎,所以存储引擎也被称为表类型

-- 查询建表语句(查询表用的引擎,默认为InnoDB)
show create table account;

在创建表时,指定存储引擎

CREATE TABLE 表名(字段1  字段1类型[COMMENT 字段1注释],字段2  字段2类型[COMMENT 字段2注释],字段3  字段3类型[COMMENT 字段3注释],字段n  字段n类型[COMMENT 字段n注释]
)ENGINE=INNODB [COMMENT 表注释];

查看当前数据库支持的引擎:SHOW ENGINES;

InnoDB存储引擎

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后InnoDB时默认的MySQL存储引擎
特点:
DML操作遵循ACID模型,支持事务
行级锁,提高并发访问性能
支持外键约束,保证数据的完整性和准确性
在这里插入图片描述

MyISAM存储引擎

MyISAM是MySQL早期的默认储存引擎
特点
不支持事务、外键
支持表锁,不支持行锁
访问速度快

Memory存储引擎

Memory引擎的表数据是存储在内存中的,由于受到硬件问题,或断电问题的影响,只能将这些表作为临时表或者缓存表使用
特点
内存存放
hash索引(默认)

在这里插入图片描述

存储引擎的选择

在选择存储引擎的时候,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合
.
InnoDB:是MySQL的默认存储引擎,支持事务、外键,如果应用对于事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那InnoDB存储引擎是很适合的操作
MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事物的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的
Memory:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存,Memory的缺陷是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性
看看大佬讲InnoDB和MyISAM
看看大佬讲Memory

索引

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引
在这里插入图片描述

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构
在这里插入图片描述
在这里插入图片描述



三种索引

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

B+Tree特点:数据都在叶子节点上;叶子节点会形成一个单向链表
.
.
MySQL索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,即
在这里插入图片描述
.
.
.
Hash索引就是采用一定的哈希算法,将键值换算为新的hash值,映射到对应的槽位上,然后存储在哈希表中
如果两个或多个键值映射到了一个相同的槽位上,它们就产生了hash冲突(也成为hash碰撞),可以通过链表来解决

Hash索引特点
Hash索引只能用来对等比较(=、in),不支持范围查询(between、>、<、…)
无法用索引完成排序操作(无序)
查询效率高,通常一次检索即可,效率通常高于B+Tree索引

在MySQL中,支持Hash索引的是Memory引擎,而InnoDB具有自适应Hash功能,Hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的

InnoDB引擎选择B+Tree索引结构的原因
相较于二叉树,层级更少,搜索效率更高
对于B-Tree,无论是叶子节点还是非叶子节点都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低
相对于Hash索引,B+Tree索引结构支持范围匹配和排序条件

索引分类

在这里插入图片描述
在这里插入图片描述
聚集索引选取规则
如果存在主键,那么主键索引就是聚集索引
如果不存在主键,那么将使用第一个唯一索引作为聚集索引
如果没有主键,也没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
在这里插入图片描述
如果执行select * from ueser where name = 'Arm';则会执行回表查询·:即先通过二级索引找到对应的主键,再通过聚集索引和找到的主键来找到这一行的数据

语法(创建/查看/删除)

创建索引:CREATE [ UNIQUE | FULLTEXT ] INDEX 索引名 ON 表名 (要添加索引的字段名,...);
单列索引:一个索引关联了一个字段
联合索引:一个索引关联的多个字段

查看索引:SHOW INDEX FROM 表名;

删除索引:DROP INDEX 索引名 ON 表名;

举例

create table worker(name char(3) comment '姓名',phone char(11) comment '手机号',age tinyint unsigned comment '年龄',profession varchar(4) comment '职称',gender char(1) comment '性别',email varchar(16) comment '邮箱地址'
);insert into worker values ('张三',123456,18,'经理','男','1122@123.com'),('李四',698547,20,'员工','女','2265@125.com'),('王五',642851,19,'员工','女','123365@123.com'),('张三',125462,25,'保安','男','1652@125.com');show index from worker;-- 为name字段创建索引(可重复)
create index index_worker_name on worker(name);-- 为phone创建唯一索引
create unique index index_worker_phone on worker(phone);-- 为age、profession、gender创建联合索引
create index idx_worker_age_pro_ged on worker(age,profession,gender);-- 为email创建合适的索引来提高查询效率
create index idx_worker_email on worker(email);-- 删除索引
drop index idx_worker_email on worker;

性能分析工具

SQL执行频率

通过SQL执行频率,我们可以更好地进行SQL优化,从而提高数据库性能

MySQL客户端连接成功后,通过show [session|global] status命令可以提供服务器状态指令。通过如下指令,可以查看当前数据库增删改查语句的访问频次
SHOW GLOBAL STATUS LIKE 'Com_______';

慢查询日志

通过慢查询日志,我们可以查清楚哪些语句执行效率较低,从而对语句进行更细致的优化,最终提高数据库性能

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志
大佬内容

profile详情

有些SQL语句业务简单,但执行时间较长,这条SQL语句效率相对较低,需要优化

show profiles能够在SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看见当前MySQL是否支持profile操作:SELECT @@have_profiling;
profiling默认关闭,可以通过SET语句在session/global级别开启profiing;
show profiles;:查看每一条SQL语句的耗时基本情况
show profile for query query _id;:查看指定query _id的SQL语句的耗时情况
show profile cpu for query query _id;`:查看指定query _id的SQL语句CPU的使用情况

explain执行计划

explain或desc命令获取MySQL如何执行SELECT语句的信息,包括SELECT语句执行过程中表如何连接以及连接的顺序,从而评判SQL语句的性能
语法:在任意的SELECT语句前面加上EXPIAIN或DESC

explain执行计划各字段含义
.
id:select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
.
select_type:表示select的类型常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
.
type:表示连接类型,性能由好到差的连接类型为:NULL(不访问表查询)、system(访问系统表查询)、const(根据主键或者唯一索引查询)、eq_ref、ref(根据非唯一索引查询)、range、index(用了索引)、all(全盘查询)
.
possible_key:显示可能应用在这张表上的索引,一个或多个
.
key:实际使用的索引,如果为NULL,则没有使用索引
.
key_len:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,再不损失精确度的情况下,长度越短越好
.
rows:MySQL认为必须要执行查询的行数,在InnoDB引擎的表中是一个估计值,可能并不总是准确的
.
filtered:表示返回结果的行数占需读取行数的百分比,filtered的值越大越好

索引的使用规则(及失效情况)

最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是从查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃某一列,则索引部分失效(后面的字段索引失效)

举例

-- 索引长度为26
explain select * from worker where age=18 and profession='经理' and gender='男';-- 索引长度为21
explain select * from worker where age=18 and profession='经理' ;-- 索引长度为2
explain select * from worker where age=18;-- 未遵循最左前缀法则,索引全部失效
explain select * from worker where  profession='经理' and gender='男';-- 未遵循最左前缀法则,索引部分失效(索引长度为2)
explain select * from worker where age=18 and  gender='男';-- 索引长度为26(即最左前缀法则只看索引是否存在,与SQL语句中索引位置无关)
explain select * from worker where profession='经理' and gender='男' and age=18;

范围查询失效情况

联合索引中出现范围查询(>,<)时范围查询右侧的索引会失效(可使用>=,<=规避问题)
举例

-- 索引长度为2
explain select * from worker where age>17 and profession='经理' and gender='男';-- 索引长度为2(与SQL语句中索引位置无关)
explain select * from worker where profession='经理' and gender='男' and age>17;-- 索引长度为26
explain select * from worker where age>=17 and profession='经理' and gender='男';

索引列运算

不要再索引列上进行运算操作,否则索引会失效
举例

-- 索引长度为67
explain select * from worker where email='1122@123.com';-- 索引失效(因为对索引列进行了运算)
explain select * from worker where substring(email,2,2) = 12;

字符串不加引号

字符串类型字段使用时不加引号,索引将失效
举例

-- 索引失效
explain select * from worker where phone=123456;

模糊查询

如果仅仅是尾部模糊匹配,索引不会失效;如果是头部模糊匹配,索引失效。
举例

-- 索引长度为45
explain select * from worker where phone like '12____';-- 索引长度为45
explain select * from worker where phone like '12__56';-- 索引失效
explain select * from worker where phone like '____56';-- 索引失效
explain select * from worker where phone like '%34__';

or连接的条件

用or分割开的条件,所有条件中的列都需要有索引,否则涉及的索引都不会用到(即失效)
举例

-- 删除索引
drop index idx_worker_email on worker;-- ------------------------------------------------------------------------- 索引失效
explain select * from worker where phone='123456' or email='1122@123.com';-- 索引失效
explain select * from worker where email='1122@123.com' or phone='123456';-- 索引长度分别为45,13
explain select * from worker where phone='123456' or name='张三';

数据分布的影响

如果MySQL评估使用索引比全表更慢,则不使用索引
举例

-- 索引失效,走的是全盘扫描
explain select * from worker where age>=0;-- 索引失效,走的是全盘扫描
explain select * from worker where phone is not null;

SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示 来达到优化操作的目的

关于索引的**(即当字段的索引有多种的时候,人为地让数据库使用特定的索引)**

use index():告诉数据库应该使用哪种索引(有可能不听你的)

ingore index():告诉数据库应该忽略哪种索引

force index():告诉数据库必须使用哪种索引

举例

explain select * from worker use index(idx_worker_age) where age=18;explain select * from worker ignore index(idx_worker_age) where age=18;explain select * from worker ignore index(index_worker_name) where name='张三';explain select * from worker force index(idx_worker_age) where age=18;

覆盖索引

尽量使用覆盖索引(查询使用了索引,并且所需返回的列,在该索引中已经能全部找到),减少select *的使用
举例

-- Extra显示Using index condition
explain select * from worker where age = 18 and profession = '张三' and gender = '男';-- Extra显示Using where; Using index
explain select age,profession,gender from worker where age = 18 and profession = '张三' and gender = '男';-- Extra显示Using index condition
explain select age,profession,gender,name from worker where age = 18 and profession = '张三' and gender = '男';

Extra显示Using index condition:查找使用了索引,但需要回表查询数据
Extra显示Using where; Using index:查找使用了索引,由于需要的数据都能在索引列中找到,所以不需要回表查询数据
覆盖索引更详细解析

前缀索引

当字段类型为字符串(varchar、text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时会浪费大量的磁盘IO,影响查询效率.此时可以只将字符串的一部分进行前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率

创建语法:创建索引:CREATE [ UNIQUE | FULLTEXT ] INDEX 索引名 ON 表名 (字段(n));(n表示前缀的长度)

前缀长度可以根据索引的选择性来决定;而选择性时是指不重复的索引值(基数)和数据表的记录总数的比值。索引的选择性越高查询效率越高
唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的

举例

-- 由于phone字段的是唯一索引,因此选择性为1
select count(distinct phone) / count(*) from worker;-- 选择性为1
select count(distinct substring(phone,1,3)) / count(*) from worker;-- 选择性为0.75
select count(distinct substring(phone,1,2)) / count(*) from worker;

由于前缀索引的长度以及选择性是呈反比关系,所以在使用时要进行取舍

单列索引/联合索引

单列索引:即一个索引只包含了一个列
联合索引:即一个索引只包含了多个列

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议联合索引,而非单列索引

多条件联合查询时,MySQL优化器会评估哪个字段的查询效率更高,会选择该索引完成本次查询

索引设计原则

针对于数据量较大(>一百万),且查询比较频繁的表建立索引(索引是用来方便查询用的)
.
针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引
.
尽量选择区分度高(即重复度低)的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率就越高
.
如果是字符串类型的字段,字符的长度较长,可以针对于字段的特点,建立前缀索引
.
尽量使用联合索引、减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表查询,提高查询效率
.
要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价就越大,会影响增删改的效率
.
如果索引列不能存储NULL值,请在创造表的时候使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好的确定哪个索引最有效地用于查询

相关文章:

存储引擎、索引(MySQL笔记第四期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 存储引擎概念InnoDB存储引擎MyISAM存储引擎Memory存储引擎存储引擎的选择 索引三种索引索引分类语法(创建/查看/删除)性能分析工具SQL执行频率慢查询日志profile详情explain执行计…...

全面汇总windows进程通信(二)

在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: 信号量(Semaphore)和互斥量(…...

【大模型】蓝耘智算云平台快速部署DeepSeek R1/R3大模型详解

目录 一、前言 二、蓝耘智算平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 应用场景 2.4 对DeepSeek 的支持 2.4.1 DeepSeek 简介 2.4.2 DeepSeek 优势 三、蓝耘智算平台部署DeepSeek-R1操作过程 3.1 注册账号 3.1.1 余额检查 3.2 部署DeepSeek-R1 3.2.1 获取…...

心理咨询小程序的未来发展

还在眼巴巴看着心理咨询行业的巨大蛋糕却无从下口&#xff1f;今天就来聊聊心理咨询小程序的无限潜力 据统计&#xff0c;全球超 10 亿人受精神心理问题困扰&#xff0c;国内心理健康问题也日益突出&#xff0c;心理咨询需求猛增。可传统心理咨询预约难&#xff0c;费用高&…...

硬件工程师入门教程

1.欧姆定律 测电压并联使用万用表测电流串联使用万用表&#xff0c;红入黑出 2.电阻的阻值识别 直插电阻 贴片电阻 3.电阻的功率 4.电阻的限流作用 限流电阻阻值的计算 单位换算关系 5.电阻的分流功能 6.电阻的分压功能 7.电容 电容简单来说是两块不连通的导体加上中间的绝…...

大模型本地部署硬件资源学习(包含模型微调所需资源)

大模型本地部署硬件配置学习 前言1.大模型应用需求分析扩展框架2.华为昇腾算力3.显卡信息汇总对比表4.大模型微调显卡资源指南&#xff08;Qwen系列与DeepSeek蒸馏模型&#xff09;一、Qwen系列模型微调显存需求二、DeepSeek-R1蒸馏模型微调显存需求三、显存优化策略与硬件选型…...

【DeepSeek系列】05 DeepSeek核心算法改进点总结

文章目录 一、DeepSeek概要二、4个重要改进点2.1 多头潜在注意力2.2 混合专家模型MoE2.3 多Token预测3.4 GRPO强化学习策略 三、2个重要思考3.1 大规模强化学习3.2 蒸馏方法&#xff1a;小模型也可以很强大 一、DeepSeek概要 2024年&#xff5e;2025年初&#xff0c;DeepSeek …...

Java基础常见的面试题(易错!!)

面试题一&#xff1a;为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”&#xff08;又称 “钻石问题”&#xff09;&#xff0c;即一个子类从多个父类继承到同名方法或属性时&#xff0c;编译器无法确定该调用哪个父类的成员。同时&#xff0c;多继承…...

山东大学软件学院nosql实验四

实验题目&#xff1a; 使用Java做简单数据插入 实验内容 用API方式&#xff0c;做数据插入。 使用Java语言实现数据插入界面&#xff0c;为实验一建立的学生、教师、课程表插入数据&#xff0c;可以在前端界面中录入数据之后保存&#xff0c;也可以导入Excel中的数据。 实…...

Linux | man 手册使用详解

注&#xff1a;本文为 “Linux man 手册” 相关文章合辑。 略作重排。 man 手册常用命令 1. 查看和搜索手册页 查看特定软件包的手册页&#xff0c;并使用 grep 命令过滤出包含特定关键字的行&#xff1a; man <package> | grep <keyword>在整个系统的手册页中…...

初阶数据结构(C语言实现)——1数据结构前言

1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 2.什么是算法&#xff1f; 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一…...

Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式

Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序&#xff1a; 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…...

基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现

大家好&#xff0c;今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…...

工具方法 - 合规性矩阵

Compliance matrix &#xff08;合规性矩阵&#xff09;是产品需求管理中的一个重要工具&#xff0c;它是用来识别、跟踪、监控和组织所有客户和利益相关方需求是否被满足的工具。具体来说&#xff0c;Compliance matrix需要用一行一行的证据来证明被设计的产品针对每个需求的实…...

2.2 STM32F103C8T6最小系统板的四种有关固件的开发方式

2.2.1 四种有关固件的开发方式 四种有关于固件的开发方式从时间线由远及近分别是&#xff1a;寄存器开发、标准外设驱动库开发、硬件抽象层库开发、底层库开发。 四种开发方式各有优缺点&#xff0c;可以参考ST官方的测试与说明。 1.寄存器开发 寄存器编程对于从51等等芯片过渡…...

go 环境准备

配置路径&#xff1a; GOROOT&#xff1a;D:\GoGOPATH&#xff1a;go的工作目录 D:\workspacego 验证版本&#xff1a;go version 配置第三方仓库&#xff1a; GO111MODULE&#xff1a;开启mod模式GOPROXY&#xff1a;go语言三方库地址GOSUMDB&#xff1a;go语言软件包的M…...

VMware安装Centos 9虚拟机+设置共享文件夹+远程登录

一、安装背景 工作需要安装一台CentOS-Stream-9的机器环境&#xff0c;所以一开始的安装准备工作有&#xff1a; vmware版本&#xff1a;VMware Workstation 16 镜像版本&#xff1a;CentOS-Stream-9-latest-x86_64-dvd1.iso &#xff08;kernel-5.14.0&#xff09; …...

高中数学基础-平面向量

文章目录 1、平面向量2、复数 高中数学-平面向量、复数 1、平面向量 向量&#xff1a;具有大小和方向的量称为向量&#xff1b;物理学中向量也称矢量&#xff0c;只有大小没有方向的量称为标量&#xff1b;向量的大小称为模&#xff0c;大小为1的是单位向量&#xff0c;长度为0…...

v4l2子系统学习(三)编写虚拟摄像头驱动

文章目录 1、声明2、前言3、虚拟摄像头驱动编写3.1、编写硬件相关代码3.2、程序示例 1、声明 本文是在学习韦东山《驱动大全》V4L2子系统时&#xff0c;为梳理知识点和自己回看而记录&#xff0c;全部内容高度复制粘贴。 韦老师的《驱动大全》&#xff1a;商品详情 其对应的…...

堆排序(详解)c++

堆排序 &#xff08;可以⽤ ppt 演⽰流程&#xff09; 堆排序(Heap Sort)是指利⽤堆这种数据结构所设计的⼀种排序算法。本质上是优化了选择排序算法&#xff0c;选择排序的思想是在堆排序元素中拿出最大值或最小值&#xff0c;然后把这个位置的值放在它该放的位置上就可以了&a…...

API测试工具:Swagger vs Postman 2025最新全面对比

随着微服务架构的普及和云原生应用的激增&#xff0c;高效的 API 开发、测试和文档管理工具变得越来越重要。在众多 API 工具中&#xff0c;Swagger 和 Postman 各自以不同的方式解决着 API 开发生命周期中的关键问题&#xff0c;本文将从多个维度深入对比这两款工具&#xff0…...

算法-图-数据结构(邻接矩阵)-BFS广度优先遍历

邻接矩阵广度优先遍历&#xff08;BFS&#xff09;是一种用于遍历或搜索图的算法&#xff0c;以下是具体介绍&#xff1a; 1. 基本概念 图是一种非线性的数据结构&#xff0c;由顶点和边组成&#xff0c;可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数…...

List的模拟实现(2)

前言 上一节我们讲解了list的基本功能&#xff0c;那么本节我们就结合底层代码来分析list是怎么实现的&#xff0c;那么废话不多说&#xff0c;我们正式进入今天的学习&#xff1a;&#xff09; List的底层结构 我们先来看一下list的底层基本结构&#xff1a; 这里比较奇怪的…...

【C++设计模式】观察者模式(1/2):从基础到优化实现

1. 引言 在 C 软件与设计系列课程中&#xff0c;观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里&#xff0c;我们已对观察者模式有了初步认识&#xff0c;本次将在前两次课程的基础上&#xff0c;进一步深入研究&#xff0c;着重…...

可狱可囚的爬虫系列课程 13:Requests使用代理IP

一、什么是代理 IP 代理 IP&#xff08;Proxy IP&#xff09;是一个充当“中间人”的服务器IP地址&#xff0c;用于代替用户设备&#xff08;如电脑、手机等&#xff09;直接与目标网站或服务通信。用户通过代理IP访问互联网时&#xff0c;目标网站看到的是代理服务器的IP地址&…...

冒险岛079 V8 整合版源码搭建教程+IDEA启动

今天教大家来部署下一款超级怀旧游戏冒险岛&#xff0c;冒险岛源码是开源的&#xff0c;但是开源的代码会有各种&#xff0c;本人进行了加工整合&#xff0c;并且用idea进行了启动测试&#xff0c;经过修改后没有任何问题。 启动截图 后端控制台 前端游戏界面 声明 冒险岛源码…...

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…...

[250224] Yaak 2.0:Git集成、WebSocket支持、OAuth认证等 | Zstandard v1.5.7 发布

目录 Yaak 2.0 发布&#xff1a;Git 集成、WebSocket 支持、OAuth 认证等众多功能&#xff01;Zstandard v1.5.7 发布&#xff1a;性能提升&#xff0c;稳定性增强 Yaak 2.0 发布&#xff1a;Git 集成、WebSocket 支持、OAuth 认证等众多功能&#xff01; Yaak&#xff0c;一款…...

插入排序:一种简单而直观的排序算法

大家好&#xff01;今天我们来聊聊一个简单却非常经典的排序算法——插入排序&#xff08;Insertion Sort&#xff09;。在所有的排序算法中&#xff0c;插入排序是最直观的一个。 一、插入排序的基本思想 插入排序的核心思想是&#xff1a;将一个待排序的元素&#xff0c;插…...

vue2响应式数据原理

1. 核心原理 Vue 2 的响应式系统基于 Object.defineProperty&#xff0c;通过 依赖收集 和 派发更新 来实现数据的响应式 依赖收集&#xff1a;在读取数据时&#xff0c;记录哪些函数&#xff08;或组件&#xff09;依赖了该数据。派发更新&#xff1a;在修改数据时&#xff…...

对免认证服务提供apikey验证

一些服务不带认证&#xff0c;凡是可以访问到服务端口&#xff0c;都可以正常使用该服务&#xff0c;方便是方便&#xff0c;但是不够安全。 比如ollama默认安装后就是这样。现在据说网上扫一下端口11434&#xff0c;免apikey的ollama服务一大堆。。。 那我们怎样将本机安装的o…...

算法——Trie 树

Trie 树&#xff08;前缀树或字典树&#xff09;是一种高效处理字符串集合的树形数据结构&#xff0c;核心思想是通过共享公共前缀来优化存储和查询。以下是 Trie 树的详细介绍&#xff1a; 1. Trie 树的基本概念 结构特点&#xff1a; 每个节点表示一个字符。从根节点到某一节…...

python中的JSON数据格式

文章目录 什么是json主要功能Python数据和Json数据的相互转化 什么是json JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据。JSON本质上是一个带有特定格式的字符串。 主要功能 json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编…...

服务器能否拒绝非浏览器发起的HTTP请求?

互联网各领域资料分享专区(不定期更新): Sheet 前言 服务器可以采取多种方法来拒绝非浏览器发起的HTTP请求,但需要明确的是:HTTP协议本身并不限制客户端类型,任何符合协议规范的请求都会被处理。因此,拒绝非浏览器请求需依赖额外策略。 正文 一、基于请求头过滤 1、Us…...

深度学习之图像分类(二)

前言 文章主要是通过实战项目——食品分类来理解分类项目的整体流程。除此之外&#xff0c;还需要对半监督学习&#xff0c;迁移学习&#xff0c;数据增广&#xff0c;Adam和AdamW进行了解。 数据增广 图片增广&#xff08;Image Data Augmentation&#xff09;是深度学习中一种…...

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…...

利用开源小智AI制作桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...

uniapp在app下使用mqtt协议!!!支持vue3

什么&#xff1f;打包空白&#xff1f;分享一下我的解决方法&#xff01; 第一步 找大师算过了&#xff0c;装4.1版本运气好&#xff01; 所以根目录执行命令… npm install mqtt4.1.0第二步 自己封装一个mqtt文件方便后期开坛做法&#xff01; // utils/mqtt.js import mqt…...

Orange 开源项目 - 集成阿里云大模型

1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员&#xff0c;都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作&#xff0c;在5分钟内开发出一款大模型应用&#xff0c;或在几小时内训练…...

DSP芯片C6678的SRIO及其中断跳转的配置

C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码&#xff0c;部分参考于网友们的博客&#xf…...

MongoDB#常用脚本

批量插入数据脚本 const oneDayAgo new Date(Date.now() - 1 * 24 * 60 * 60 * 1000);const documents []; for (let i 1; i < 100; i) {documents.push({id: i, // 递增的 idcreateTime: oneDayAgo, // 1天前的日期data: Sample data ${i} // 其他字段&#xff08;可选…...

MySQL 主从集群同步延迟问题分析与解决方案

MySQL 主从复制&#xff08;Replication&#xff09;是构建高可用架构的核心技术&#xff0c;但在实际应用中&#xff0c;主从同步延迟&#xff08;Replication Lag&#xff09;是常见且棘手的问题。延迟会导致从库数据不一致、读请求返回旧数据&#xff0c;甚至引发业务逻辑错…...

论文笔记(七十二)Reward Centering(五)

Reward Centering&#xff08;五&#xff09; 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…...

FFmpeg 是什么?为什么?怎么用?

摘要&#xff1a;本文介绍了 FFmpeg&#xff0c;一个功能强大的开源多媒体处理工具&#xff0c;广泛应用于视频和音频文件的处理。FFmpeg 支持多种多媒体格式&#xff0c;能够实现视频编码/解码、格式转换、裁剪、合并、音频提取、流媒体处理等功能。本文详细阐述了 FFmpeg 的主…...

雷池WAF动态防护技术实测

作者&#xff1b; Hacker / 0xh4ck3r 介绍 长亭雷池&#xff08;SafeLine&#xff09;是由北京长亭科技有限公司耗时近10年研发并推出的Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;其核心检测能力由智能语义分析算法驱动。雷池旨在为用户提供高质量的Web攻击防护、…...

BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】

模板&#xff1a; {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串&#xff0c;.__class__代表这个空字符串的类是什么&#xff08;这里是单引号双引号都行&a…...

【每日八股】Redis篇(二):数据结构

Redis 数据类型&#xff1f; 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS&#xff08;简单动态字符串&#xff09;&#xff0c;其主要应用场景包括&#xff1a; 缓存对象&#xff1a;可以用 STRING 缓存整个对象的 JSON&…...

VScode+stfp插件,实现文件远程同步保存【2025实操有效】

目录 1 痛点2 准备工作3 操作步骤3.1 第一步&#xff0c;下载STFP插件3.2 第二步&#xff0c;修改配置文件3.3 第三步&#xff0c;测试是否成功 4 后记 1 痛点 我一直用vscode远程连接服务器&#xff0c;传代码文件等到服务器上面&#xff0c;突然有一次服务器那边尽心维修&am…...

115 道 MySQL 面试题,从简单到深入!

1. 什么是数据库事务&#xff1f; 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xf…...

不同安装路径重复R包清理

df <- as.data.frame(installed.packages()) table(duplicated(df$Package)) ids <- df$Package[duplicated(df$Package)] df2 <- subset(df, df$Package %in% ids)...