MySQL进阶(一)
一、存储引擎
1. MySQL体系结构
连接层:
最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限
服务层:
第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等
引擎层:
存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据的需要,来选取合适的存储引擎
存储层:
主要是将数据存储在文件系统之上,并完成与存储引擎的交互
2. 存储引擎简介
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被成为表类型。
查看所有的存储引擎:
show engines;
3. 存储引擎特点
InnoDB
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在mysql5.5之后,InnDB是默认的mysql存储引擎。
特点:
- DML操作遵循ACID模型,支持事务;
- 行级锁,挺高并发访问性能;
- 支持外键FOREIGN KEY约束,保证数据的完整性和正确性;
文件:
xxx.ibd:xxx代表的是表名,innodb引擎的每张表都会对应一个这样的一个表空间文件(.ibd),存储该表的表结构(frm、sdi)、数据和索引。参数:innodb_file_per_table开启时,是这样的
ibd2sdi xxx.ibd #可以查看表结构,在文件所在目录执行此命令
逻辑存储结构:
MyISAM
是mysql早期默认的存储引擎,对应目录文件有.myd(存放数据)、.myi(索引)、.sdi(表结构)后缀的
特点:
- 不支持事务,不支持外键
- 支持表锁,不支持行锁
- 访问速度快
Memory
Memory引擎的表数据是存储在内存中的,由于收到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。
特点:
- 访问速度快
- hash索引(默认)
文件:
xxx.sdi:存储表结构信息
4. 存储引擎选择
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。
- InnoDB:是mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择
- MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性不是很高,那么选择这个引擎是非常合适的。用mongodb替代
- MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。用redis替代
二、索引
1. 索引概述
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
2. 索引结构
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:
我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。
二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢。
红黑树:比不平衡二叉树好一点,但是,大数据量情况下,层级较深,检索速度慢。
B-Tree(多路平衡查找树)
B+Tree
相对于B-Tree区别:
1)所有的数据都会出现在叶子节点
2)叶子节点形成一个单向链表
MySQL索引数据结构对经典的B+Tree进行了优化。在原有B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。
Hash结构
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。
如上图所示:id是主键,现在我们要为name字段创建一个哈希索引的数据结构,将算出这张表每行数据的哈希值,拿到name字段的所有值,通过哈希函数计算每个name值落在哪个哈希表的槽位上,同时解决哈希冲突。
哈希索引特点:
- 哈希索引只能用于等值比较,不支持范围查询
- 无法利用索引完成排序操作
- 查询效率高,通常只需要一次检索就可以了(不存在哈希冲突的情况下),效率通常要高于B+Tree索引
在MySQL中,支持hash索引的是Memor引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。
面试题:为什么InnoDB存储引擎中选择使用B+Tree索引结构?
二叉树会变成链表,红黑树层级多。
- 相对于二叉树,层级更少,搜索效率高
- 对于B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,若一页的容量固定,这样导致一页中存储的键值减少,指针跟着减少 ,要同样保存大量数据,只能增加树的高度,导致性能降低
- 相对hash索引,B+Tree支持范围匹配及排序操作;
3. 索引分类
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引
- 如果不存在主键,将使用第一个唯一索引作为聚集索引
- 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
执行一条sql语句(select * from user where name='Arm';)的顺序:首先走二级索引找到'Arm',然后找到叶子节点,找到对应的主键值,然后拿着主键值在聚集索引中找到那一行的数据。这一过程称为回表查询。
思考1:以下sql语句,哪个执行效率高?为什么?
select * from user where id=10;
select * from user where name='Arm';
备注:id为主键,name字段创建的有索引;
第一条效率高,因为第二条还需要回表查询
思考2:InnoDB主键索引的B+Tree高度是多高?
假设:一行数据大小为1k,一页中可以存储16行这样的数据。InnoDB的指针占用6个字节的空间,主键即使为bigint,占用字节数为8.
高度为2:
n*8+(n+1)*6=16*1024,算出n约为1170
1171*16=18736
高度为3:
1171*1171*16=21939856
4. 索引语法
4.1创建索引
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);
4.2查看索引
SHOW INDEX FROM table_name;
4.3删除索引
DROP INDEX index_name ON table_name;
5. SQL性能分析
5.1 查看执行频率
MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过以下指令,可以查看当前数据库的INSERT、update、delete、select的访问频次
show status like 'Com_______';
5.2 慢查询日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
show variables like '%slow_query_log%';
MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf linux)window系统在my.ini中配置如下信息:
linux
#开启MySQL慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
slow_query_time=2
windows
#开启MySQL慢日志查询开关
slow_query_log=ON
#设置慢日志的时间为5秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=5
也可以执行sql语句,开启慢查询,不过临时生效,mysql重启后就会失效
set global slow_query_log='ON';
set global slow_query_log_file='D:\\kpdata\\DataBase\\Data\\mysql.log';
配置完毕之后,通过以下指令重新启动 MySQL服务器进行测试,查看慢日志文件中记录的信息D:\phpstudy_pro\Extensions\MySQL8.0.12\data\yifeng-slow.log。
5.3 profile详情
通过查看慢查询日志,可以找到耗时长的sql,但是并不能定位问题。
show profiles能够在做sql优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前mysql是否支持profiles操作:
show variables like '%profil%';
默认profiling是关闭的,可以通过set语句在session/global级别开启profiling:
set profiling=1;
然后就可以执行一系列的业务SQL的操作,通过以下指令查看指令的执行耗时:
#查看每一条sql的耗时基本情况
show profiles;
#查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id
#查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id
5.4 explain执行计划
通过以上步骤查询到效率低的 SQL 语句后,可以通过 EXPLAIN或者 DESC命令获取 MySQL如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。
语法:
#直接在select语句之前加上关键字explain/desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;
字段 | 含义 |
---|---|
id | select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。若多表查询,才可以看见效果 |
select_type | 表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等 |
table | 输出结果集的表 |
type | 表示表的连接类型,性能由好到差的连接类型为(null---> system(系统表) ---> const(唯一索引) -----> eq_ref ------> ref(非唯一索引) -------> ref_or_null----> index_merge ---> index_subquery -----> range -----> index(用了索引,但是会遍历整个索引树) ------> all ) |
possible_keys | 表示查询时,可能使用的索引 |
key | 表示实际使用的索引 |
key_len | 索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好 |
rows | 必要要执行查询的行数,在innodb引擎的表中,是一个估值,可能并不是准确的 |
filtered | 表示返回结果的行数占需读取行数的百分比,filtered的值越大越好 |
extra | 执行情况的说明和描述 |
6. 索引使用
6.1 验证索引效率
6.2 最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)
6.3 索引失效情况一
- 索引列运算,不要在索引列上进行运算操作,否则索引将失效,若substring函数
- 字符串不加引号,字符串类型字段使用时,不加引号,索引将失效
- 模糊查询,如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效
6.4 索引失效情况二
- or连接的条件。用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引不会被用到。所以or连接的条件字段都必须建立索引
- 数据分布影响,如果mysql评估使用索引比全表更慢,则不用索引。查询出来的数据占全表的绝大多数,is null或is not null走不走索引,跟数据分布有关系
6.5 SQL提示
SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的
use index:
explain select * from tb_seller use index(idx_seller_name) where name = '小米科技';
ignore index:
explain select * from tb_seller ignore index(idx_seller_name) where name = '小米科技';
force index:
explain select * from tb_seller force index(idx_seller_name) where name = '小米科技';
6.6 覆盖索引
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到,也就是查询的列都是索引),减少select *。
通过测试,使用覆盖索引的执行计划的Extra对应的是【Using where;Using index】,而索引没有覆盖时,Extra对应的是【Using index condition】,毫无疑问,前者效率高
知识补充:
Using index condition:查找使用了索引,但是需要回表查询数据
Using where;Using index:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
6.7 前缀索引
当字段类型为字符串(varchar、text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询小i率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
语法:create index idx_xxx on table_name(column(n)); n:要提取字符串的前n个字符建立索引
前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
根据这个原则的做法:先查看根据要做前缀索引的字段的总数,然后再查看那个字段去重之后的数量,计算比值【select count(email) from tb_user; select count(distinct email) from tb_user;】
前缀索引的查询流程:传入的字段截取之后,进行查询,也需要回表查询,回表之后,找到那条记录,其中索引值匹配,匹配成功才返回当前记录
6.8 单列&联合索引
单列索引:一个索引只包含单个列
联合索引:一个索引包含了多个列
推荐使用联合索引:多条件联合查询时,mysql优化器会评估哪个字段的索引效率更高,然后自行选择。经测试,联合索引效率高(因为一般不需要回表查询)
联合索引的数据结构和查询流程:
7. 索引设计原则
- 针对于数据量大,且查询比较频繁的表建立索引
- 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引
- 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
- 如果是字符串类型的字段,字段的长度较长,可以针对字段的特点,建立前缀索引
- 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率
- 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价就越大,会影响增删改的效率
- 如果索引不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引更有效地用于查询
三、SQL优化
1. 插入数据
insert优化
1)批量插入
原始:
insert into tb_test values(1,'Tom');
insert into tb_test values(2,'Cat');
insert into tb_test values(3,'Jerry');优化后:
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
2)手动提交事务
start transaction;
insert into tb_test values(1,'Tom');
insert into tb_test values(2,'Cat');
insert into tb_test values(3,'Jerry');
commit;
3)主键有序插入
insert into tb_test values(1,'Tom');
insert into tb_test values(2,'Cat');
insert into tb_test values(3,'Jerry');
insert into tb_test values(4,'Tim');
insert into tb_test values(5,'Rose');
4)大批量插入数据
如果一次性需要插入大批量数据,使用Insert语句插入性能较低,此时可以使用load指令进行插入。
#客户端连接服务端时,加上参数--local-infile
mysql --local-infile -u root -p
#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
#执行load指令将准备好的数据,加载到表结构中
load data local infile '/地址' into table 表名 fields terminated by '.' lines terminated by '\n';
2. 主键优化
数据组织方式:在innodb存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)
页分裂: 页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据过多,会行溢出),根据主键排序。假如主键是乱序排列的,有新数据进来,首先发现自己应该去的那个页放不下了,然后就将前面的那些数据放入新开辟的页中,自己紧随其后,然后页之间重新链接。
页合并:当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记为被删除并且它的空间变得允许被其他记录声明使用。当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),innodb会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。
主键设计原则:
- 满足业务需求的情况下,尽量降低主键的长度
- 插入数据时,尽量选择顺序插入(乱序插入会发生页分裂),选择使用AUTO_INCREMENT自增主键。
- 尽量不要使用UUID做主键或者时其他自然主键(太长),如身份证号
- 业务操作时,尽量避免对主键的修改
3. order by优化
Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫filesort排序
Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高
假如排序时,一个字段升序,一个字段降序,因为默认是升序排列嘛,extra肯定会出现filesort,如想要额外开销直接没有filesort, 可以创建索引,自定义升序和降序
#根据age、phone进行一个升序,一个降序
explain select id, age, phone from tb_user order by age asc, phone desc;
#创建索引
create index idx_user_age_phone_ad on tb_user(age asc, phone desc);
#根据age、phone进行一个升序,一个降序
explain select id, age, phone from tb_user order by age asc, phone desc;
一切的前提都是使用了覆盖索引的前提下,假设索引没有覆盖,那么肯定还会出现 filesort
优化:
- 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
- 尽量使用覆盖索引
- 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC,DESC)
- 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认256K)
4. group by优化
- 在分组操作时,可以通过索引来提高效率
- 分组操作时,索引的使用也是满足最左前缀法则的
5. limit优化
一个常见又非常头疼的问题就是limit 2000000,10,此时需要mysql排序前2000010记录,仅仅返回2000000-2000010的记录,其他记录丢弃,查询排序的代价非常大。
优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。
explain select * from tb_test t, (select id from tb_test order by id llimit 2000000,10) a
where t.id = a.id
6. count优化
- MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高
- innodb引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累计计数
- 优化思路:自己计数
count的几种用法:
- count()时一个聚合函数,对于返回的结果集,一行行的判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值
- 用法:count(*)、count(主键)、count(字段)、count(1)
- count(主键):innodb引擎会遍历整张表,把每一行的主键Id值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)
- count(字段):没有not null约束(innodb引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加);有not null约束(innodb引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接进行计数累加)
- count(1):innodb引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。
- count(*):innodb引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加
按照效率排序的话:count(字段) <count(主键) < count(1) 约等于count(*),尽量使用count(*)
7. update优化
首先开启事务,根据非索引字段进行更新,事务未提交之前,其余事务是不能操作这张表的,是因为条件不是索引字段,启用的是表锁。
优化思路:innodb的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。
相关文章:
MySQL进阶(一)
一、存储引擎 1. MySQL体系结构 连接层: 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层: 第二层架构主要完成大多数的核心服务…...
ThreadLocal理解
1.thread是线程,threadLocal是对象? 在 Java 中: Thread 是线程类,其实例代表线程:Thread 类用于创建和管理线程,每个线程都是 Thread 类的一个实例,用于执行具体的任务,例如&…...
PyTorch、Flash-Attn、Transformers与Triton技术全景解析+环境包
PyTorch、Flash-Attn、Transformers与Triton技术全景解析 包好难找 这里是下载链接 添加链接描述 摘要 本文系统性地介绍了深度学习领域的四大关键技术框架:PyTorch、Flash-Attn、Hugging Face Transformers和Triton,分别从核心特性、技术优势、应用场…...
mindyolo填坑
1、按照gitee上的文档跑预测代码,跑不通 更改: 将predict.py复制到跟目录。如果是cpu(本地测试比较常见),那么正确的命令行是: python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…...
【C++】平衡二叉树(AVL树)迭代版
目录 前言: 一:判断一棵树是否为平衡二叉树 二:明确思路 1.为什么使用平衡二叉树 2.旋转 2.1 左旋 2.2 右旋 3.冲突节点 4.平衡因子 5.双旋 5.1 左右双旋(LR) 5.2 右左双旋(RL) 6.平衡因子的更新 7.冲突节点问题补充 三&…...
双链表详解
一、双向链表介绍 二、实现双向链表 1.定义双向链表的结构 2.双向链表的初始化 3.双向链表的尾插 4.双向链表的头插 5.双向链表的打印 6.双向链表的尾删 7.双向链表的头删 8.查找指定位置的数据 9.在指定位置之后插入数据 10.删除指定位置的数据 11.链表的销毁 三、…...
6.9.单源最短路径问题-BFS算法
一.前言: 问题1: 以上述图片为例,比如从G港到Y城,可以是G港->R城->Y城,也可以是G港->P城->Y城等,有很多条路径都可以实现从G港到Y城,但要从中找出G港到Y城距离最短的那一条路径&am…...
react js 查看字体效果
起因, 目的: 想查看某个字体,对中英文的支持情况。 效果图: 完整项目见这里, 需要积分下载,不然的话,显得太水了。 过程: AI 对话, 生成代码。我检查运行, 来回修改。写个博客,…...
GZIPInputStream 类详解
GZIPInputStream 类详解 GZIPInputStream 是 Java 中用于解压缩 GZIP 格式数据的流类,属于 java.util.zip 包。它是 InflaterInputStream 的子类,专门处理 GZIP 压缩格式(.gz 文件)。 1. 核心功能 解压 GZIP 格式数据(RFC 1952 标准)自动处理 GZIP 头尾信息(校验和、时…...
数字智慧方案6206丨智慧园区大数据整体解决方案(45页PPT)(文末有下载方式)
资料解读:智慧园区大数据整体解决方案 详细资料请看本解读文章的最后内容。 在数字化快速发展的当下,智慧园区成为推动产业升级和城市发展的关键力量。这份智慧园区大数据整体解决方案,融合前沿技术与创新理念,为园区的高效管理、…...
Linux系统常用命令、标准C库函数和系统调用
目录 一、常用命令 env echo $name 键值 export name unset name gcc -c xxx.c ar 命令 ar -r libxxx.a xxx1.o xxx2.o gcc -c -fpic xxx.c gcc -shared -fpic xxx1.c xxx2.c -o libxxx.so kill [-信号] PID kill -l 软链接:ln -s xxx yyy 硬链接&…...
【Linux】基础指令(2)
man linux中有很多指令,我们不可能全部记住,man是linux/unix系统中的手册页指令,当我们遇到不熟悉的命令可以用man来查看命令,函数,配置文件的详细使用说明。 man手册分为多个章节,详情如下: …...
“会话技术”——Cookie_(2/2)原理与使用细节
经过Cookie的快速入门与代码使用。如果想深入理解Cookie的技术实现,就得去理解它的原理。 且有些时候使用Cookie,还要根据需求设置存活期限以及确定Cookie获取范围等其他细节。最后,我们会总结Cookie这门客户端会话技术的作用。 一、原理 注…...
Linux操作系统--进程间通信(中)(命名管道)
目录 1.命名管道: 1.1创建一个命名管道 1.2匿名管道与命名管道的区别 1.3命名管道的打开规则 1.4例子1-用命名管道实现文件拷贝 1.5例子2-用命名管道实现server&client通信 1.命名管道: 毫不相关的进程进行进程间通信管道应用的一个限制就是只能…...
数据结构6 · BinaryTree二叉树模板
代码函数功能顺序如下: 1:destroy:递归删除树 2:copy:复制二叉树 3:preOrder:递归前序遍历 4:inOrder:递归中序遍历 5:postOrder:递归后续遍…...
ubuntu的libc 库被我 sudo apt-get --reinstall install libc6搞没了
我系统的libc 没了 今天为了运行一个开源的yuv 播放器,在运行的时候提醒 Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion sym ! NULL failed!然后听从AI 的建议 当我去执行ls 时,系统提示 就这…...
cat file.tar.gz | tar -xzf - -C /target/dir两个减号之间为什么有个空格?是写错了吗?(管道命令后续)
在 tar 命令的参数 -xzf - -C 中,两个减号(-)之间的空格是故意保留的语法,没有写错。具体原因如下: 1. -xzf - 的语法解析 -xzf 是 tar 命令的组合参数: x:表示解压(extract&#x…...
手机的数据楚门世界是如何推送的
手机推送,也叫茧影算法,手机的数据“楚门世界”:信息推送机制的深度剖析与社会影响 在数字化时代,手机已然成为人们生活中不可或缺的伴侣。当我们沉醉于手机带来的便捷与娱乐时,或许未曾察觉,自己正置身于…...
体系结构论文(八十二):A Comprehensive Analysis of Transient Errors on Systolic Arrays
研究背景与动机 TPU架构(Tensor Processing Unit)广泛应用于DNN推理,其核心是脉动阵列,由大量的乘加单元(MAC)组成。 由于使用了纳米级CMOS技术,TPU对辐射引发的瞬态错误(SET&#…...
综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理
文章目录 0.实现需求1.新建购物车模块cart2.使用json-server模拟向后端请求数据3.在vuex请求获取并存入数据,并映射到组件中,在组件中渲染【重点】3.1.安装axios3.2.准备actions和mutations,获取和存入数据到vuex中3.3.动态渲染:用mapState映射 其他1.为什么在axios在项目中要局…...
二叉搜索树的判断(双指针解决)
98. 验证二叉搜索树 - 力扣(LeetCode) class Solution { public:TreeNode*preNULL;bool isValidBST(TreeNode* root) {if(rootNULL){return true;}bool leftisValidBST(root->left);if(pre!NULL&&pre->val>root->val){return fals…...
关于CSDN创作的常用模板内容
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 好文评论新文推送 📃文章前言 &…...
不小心误删了文件,找Windows数据恢复工具来帮忙
相信很多人都遇到过这样的情况:不小心在电脑上删除了一些重要的文件,等到想要找回来时,却感觉特别棘手。 今天我要给大家推荐一款超棒的Windows数据恢复工具,它能轻松帮你找回那些被误删的文件。 (文末附下载链接&…...
[Verilog]跨时钟域数据传输解决方案
跨时钟域数据传输解决方案 摘要:跨时钟域数据传输 (Clock Domain Crossing, CDC) 是 SoC 设计中常见且关键的问题,因为现代 SoC 通常包含多个时钟域,不同模块可能运行在不同频率或相位的时钟下。跨时钟域传输数据时,如果处理不当,可能会导致亚稳态 (Metastability)…...
Linux——进程终止/等待/替换
前言 本章主要对进程终止,进程等待,进程替换的详细认识,根据实验去理解其中的原理,干货满满! 1.进程终止 概念:进程终止就是释放进程申请的内核数据结构和对应的代码和数据 进程退出的三种状态 代码运行…...
数据结构与算法:图论——最短路径
最短路径 先给出一些leetcode算法题,以后遇见了相关题目再往上增加 最短路径的4个常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同应用场景下,应有选择地使用它们: 图的规模小,用Floyd。若边的权值有负数,需要…...
双指针(5)——有效三角形个数
题目: 这道题我们首先可能会想到暴力解法,三个for循环然后进行check()。时间复杂度肯定是不允许的。 同时,验证可以组成三角形的条件是任意两边之和大于第三边,这就意味着我们每组要进行三次比较。但也有捷…...
Qt QGraphicsScene 的用法
背景,为什么要写这篇博客 今天学习 model - view 模式的时候还看到有 scene - view 模式。不知道还有这个模式,所以学习了下。 学习后总体的感觉是:其实没有也是可以的,但有了方便许多。 从两种画图的方法开始说 以前有个项目也…...
使用 Tesseract 实现藏文OCR
要识别藏文,最常用且有效的方法是使用Tesseract OCR(谷歌开源的OCR工具),因为它拥有针对藏文的预训练模型支持。 🚀 一、安装 Tesseract OCR 软件: 下载链接:Tesseract OCR 下载页面 Windows用…...
数字智慧方案5873丨智慧交通设计方案(57页PPT)(文末有下载方式)
资料解读:智慧交通设计方案 详细资料请看本解读文章的最后内容。 智慧交通设计方案是一份详尽的交通规划文件,旨在通过科学的交通设计方法,优化交通系统,提升交通效率,确保交通安全,并促进可持续发展。该…...
【quantity】6 温度单位实现(temperature.rs)
一源码 以下代码实现了一个温度单位系统,支持开尔文(Kelvin)和摄氏度(Celsius)之间的转换和运算。 /// Temperature (kelvin) / 温度 (开尔文) use super::{Quantity, prefix::*}; use crate::unit::Kelvin; use derive_more::{Add, Sub, AddAssign, SubAssign};/…...
ARConv的复现流程
使用环境 Python 3.10.16 torch 2.1.1cu118 torchvision 0.16.1cu118 其它按照官方提供代码的requirements.txt安装 GitHub - WangXueyang-uestc/ARConv: Official repo for Adaptive Rectangular Convolution 数据准备 从官方主页下载pancollection数据集PanCollection…...
安卓游戏APK文件解密与编辑的完整攻略
在移动游戏开发中,保护游戏数据不被篡改是开发者的重要任务。然而,随着逆向工程技术的发展,破解游戏数据也变得可能。本文将详细介绍如何分析、解密和编辑APK安装包中的加密JSON文件,特别关注assets/task目录下的文件,并提供一种绕过checkfile.json中MD5校验的有效方法。通…...
JVM——JVM 是如何执行方法调用的?
JVM 是如何执行方法调用的? 在 Java 世界的底层运作中,方法调用机制是理解 Java 虚拟机(JVM)行为的关键之一。JVM 作为 Java 程序运行的核心,承担着执行字节码、管理内存、调度线程等多项职责。而方法调用作为程序逻辑…...
一天学完JDBC!!(万字总结)
文章目录 JDBC是什么 1、环境搭建 && 入门案例2、核心API理解①、注册驱动(Driver类)②、Connection③、statement(sql注入)④、PreparedStatement⑤、ResultSet 3、jdbc扩展(ORM、批量操作)①、实体类和ORM②、批量操作 4. 连接池①、常用连接池②、Durid连接池③、Hi…...
【愚公系列】《Manus极简入门》011-习惯养成教练:“习惯塑造师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例
精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例 在创业和数据分析的领域中,我们不断探索如何更精准地把握业务发展的关键要素。今天,带着与大家共同进步的想法,深入研读《精益数据分析》&a…...
50.【必备】二分答案法与相关题目
本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~ 网课链接:算法讲解051【必备】二分答案法与相关题目_哔哩哔哩_bilibili 一.爱吃香蕉的珂珂 题目:爱吃香蕉的珂珂 算法原理 整体思路 这是一个二分查找算法…...
C# 方法(局部变量和局部常量)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部变量 和第5章介绍的字段…...
MQTT 协议与 HTTP 协议的区别
在现代的网络通信中,MQTT 协议和 HTTP 协议都扮演着重要的角色,但它们有着不同的特点和适用场景。下面我们就从多个方面来详细探讨它们之间的区别。 一.协议设计理念 1. MQTT 协议 MQTT(Message Queuing Telemetry Transport)即…...
博弈论思维——AI与思维模型【90】
一、定义 博弈论思维模型是一种研究在相互影响的决策情境中,参与者如何通过策略选择来实现自身利益最大化的理论框架。它分析参与者之间的相互作用、策略组合以及由此产生的结果,帮助人们理解在竞争或合作环境下的决策逻辑和行为模式。 二、由来 博弈…...
【Bootstrap V4系列】学习入门教程之 表格(Tables)和画像(Figure)
Bootstrap V4系列 学习入门教程之 表格(Tables)和画像(Figure) 表格(Tables)一、Examples二、Table head options 表格头选项三、Striped rows 条纹行四、Bordered table 带边框的表格五、Borderless table…...
第 3 篇:有序的世界:有序表 (TreeMap/TreeSet) 的概念与优势
上一篇我们探讨了哈希表如何以牺牲顺序为代价换取极致的平均速度。然而,在现实世界的许多应用中,数据的有序性不仅是锦上添花,甚至是核心需求。想象一下: 你需要显示一个按价格排序的商品列表。你需要找到某个时间点之前或之后的…...
VulnHub-DC-2靶机
主机发现 sudo arp-scan -l 以sudo管理员权限扫描本地活动ip地址 Interface: eth0, type: EN10MB, MAC: 08:00:27:22:46:4f, IPv4: 192.168.252.230 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.252.6 4c:5f:70:74:3c:3b …...
论文笔记(八十三)STACKGEN: Generating Stable Structures from Silhouettes via Diffusion
STACKGEN: Generating Stable Structures from Silhouettes via Diffusion 文章概括摘要I. INTRODUCTIONII. 相关工作A. 从直觉物理学学习稳定性B. 用于姿态生成的扩散模型C. 自动化顺序装配 III. 方法A. 用于 S E ( 3 ) SE(3) SE(3)积木姿态生成的扩散模型B. 模型架构C. 数据生…...
论文阅读笔记——TesserAct: Learning 4D Embodied World Models
TesserAct 论文 采用RGB-DN(RGB深度法线) 作为 4D 场景中间表示,由此建模 4D 场景,比纯 2D 视频更准确地建模 3D 几何结构。相比现有的 4D 视频生成,优化速度快,收敛好,且首次从当前帧和文本描述…...
变转速振动信号分析处理与故障诊断算法模块
变转速振动信号分析处理与故障诊断算法模块,作为信号处理算法工具箱的主要功能模块,形成了以变转速振动信号分析处理与故障诊断算法模块的经典算法模型,可应用于各类关键机械部件(轴承、齿轮、转子等)的信号分析、故障…...
每日算法-250502
每日算法 - 2025.05.02 记录一下今天刷的几道 LeetCode 算法题。 3191. 使二进制数组全部等于 1 的最少操作次数 I 题目 思路 贪心 解题过程 遍历数组 nums。当我们遇到 nums[i] 时: 如果 nums[i] 是 1,我们不需要进行操作,因为目标是全 …...
如何在纯C中实现类、继承和多态(小白友好版)
基本实现原理 /* 通过结构体函数指针模拟类 */ typedef struct {// 成员变量int x; // 成员方法(函数指针) void (*print)(void* self); } MyClass;/* 成员函数实现 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…...
AE/PR插件 转场创建大师专业版 Transition Master Pro v2.0.2 Win+使用教程
Transition Master Pro v2.0.2是一款原生转场插件,专为Adobe Premiere Pro和After Effects设计。它提供了创建、导出和销售自己的转场效果,或从一个庞大的转场预设库中选择。使用Transition Master Pro v2.0.2,您可以快速轻松地创建令人惊叹的…...