【MySQL】索引 【上】 {没有索引的查询/磁盘/mysql与磁盘IO/初识索引}
文章目录
- 1.没有索引存在的问题
- 2. 认识磁盘
- MySQL与存储
- MySQL与磁盘交互基本单位
- 建立共识
- 图解IO
- 认识索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。
数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
1.没有索引存在的问题
索引:提高数据库的性能,索引是物美价廉的东西。不用加内存,不用改程序,不用调sql,只要执行正确的
create index,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。
常见索引分为:
主键索引(primary key)
唯一索引(unique)
普通索引(index)
全文索引(fulltext)–解决中文索引问题。
MySQL 的服务器,本质是在内存中的,所有的数据库的CURD操作,全部都是在内存中进行的。所以索引也是如此。
提高算法的效率因素有:1. 组织数据的方式 2.算法本身;
索引就是以组织数据的方式提高其效率的体现,主要体现其查询速度。【不合适的数据结构用在特定的场景上,再好的算法也带不起来效率,相反,数据结构很适合的话,算法效率很容易提高】
案例:
一个海量表,在查询的时候,没有索引时有什么问题?
--构建一个8000000条记录的数据
--构建的海量表数据需要有差异性,所以使用存储过程来创建, 拷贝下面代码就可以了,暂时不用理解-- 产生随机字符串
delimiter $$create function rand_string(n INT)returns varchar(255)begin
declare chars_str varchar(100) default'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';declare return_str varchar(255) default '';declare i int default 0;while i < n do
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));set i = i + 1;end while;return return_str;end $$delimiter ;--产生随机数字
delimiter $$create function rand_num()returns int(5)begin
declare i int default 0;set i = floor(10+rand()*500);return i;end $$delimiter ;--创建存储过程,向雇员表添加海量数据
delimiter $$create procedure insert_emp(in start int(10),in max_num int(10))begindeclare i int default 0;
set autocommit = 0;
repeatset i = i + 1;insert into EMP values ((start+i)
,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());until i = max_numend repeat;commit;end $$delimiter ;-- 执行存储过程,添加8000000条记录
call insert_emp(100001, 8000000);
查询员工编号为998877的员工
select * from EMP where empno=998877;
可以看到耗时4.93秒,这还是在本机一个人来操作,在实际项目中,如果放在公网中,假如同时有1000个人并发查询,那很可能就死机。
解决方法,创建索引
alter table EMP add index(empno);
换一个员工编号,测试看看查询时间:几乎是0s查询
select * from EMP where empno=123456;
2. 认识磁盘
MySQL与存储
MySQL 给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。磁盘是计算机中的一个机械设备,相比于计算机其他电子元件,磁盘效率是比较低的,在加上IO本身的特征,可以知道,如何提高效率,是
MySQL 的一个重要话题。
先来研究一下磁盘:
看磁盘中一个盘片
磁道是图中相邻两条黑线组成的圆环,每个磁道被划分为若干段(段又叫扇区),每个扇区的存储容量为512字节每个扇区都有一个编号。
磁盘表面被分为许多同心圆环,每个同心圆环称为一个磁道。每个磁道都有一个编号,最外面的是0磁道,近三十年来,扇区大小一直是512字节。但最近几年正迁移到更大、更高效的4096字节扇区,通常称为4K扇区。
扇区
数据库文件本质其实就是保存在磁盘的盘片当中。也就是上面的一个个小格子中,就是我们经常所说的扇区。当然,数据库文件很大,也很多,一定需要占据多个扇区。
从上图可以看出来,在半径方向上,距离圆心越近,扇区越小,距离圆心越远,扇区越大。那么,所有扇区都是默认512字节吗?目前是的,我们也这样认为。因为保证一个扇区多大,是由比特位密度决定的。不过最新的磁盘技术,已经慢慢的让扇区大小不同了,不过我们现在暂时不考虑。
我们在使用Linux,所看到的大部分目录或者文件,其实就是保存在硬盘当中的。(当然,有一些内存文
件系统,如:proc,sys 之类,我们不考虑)
#数据库文件,本质其实就是保存在磁盘的盘片当中,就是一个一个的文件
[root@centos ~]# ls /var/lib/mysql -l #我们目前MySQL中的文件
total 319592
最基本的,找到一个文件的全部,本质就是在磁盘找到所有保存文件的扇区。而我们能够定位任何一个扇区,那么便能找到所有扇区,因为查找方式是一样的。
柱面(磁道): 多盘磁盘,每盘都是双面,大小完全相等。那么同半径的磁道,整体上便构成了一个柱面。每个盘面都有一个磁头,那么磁头和盘面的对应关系便是1对1的,只需要知道,磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要访问的扇区。这种磁盘数据定位方式叫做CHS,不过实际系统软件使用的并不是CHS(硬件是),而是LBA ,一种线性地址,可以想象成虚拟地址与物理地址。系统将LBA地址最后会转化成为CHS ,交给磁盘去进行数据读取。我们不关心转化细节,知道这个东西,逻辑自洽起来即可。
结论
我们现在已经能够在硬件层面定位任何一个基本数据块(扇区)。那么在系统软件上,就直接按照扇区(512字节,部分4096字节),进行IO交互吗?不是!
如果操作系统直接使用硬件提供的数据大小进行交互,那么系统的IO代码,就和硬件强相关,换言之,如果硬件发生变化,系统必须跟着变化。
从目前来看,单次IO 512字节,还是太小了。IO单位小,意味着读取同样的数据内容,需要进行多次磁盘访问,会带来效率的降低。
之前学习文件系统,就是在磁盘的基本结构下建立的,文件系统读取基本单位不是扇区,而是数据块。系统读取磁盘,是以块为单位的,基本单位是4KB 。
磁盘随机访问(Random Access)与连续访问(Sequential Access)
随机访问:本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作之间需
要作比较大的移动动作才能重新开始读/写数据。
连续访问:如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始这次
IO操作,这样的多个IO操作称为连续访问。
因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随
机访问,而非连续访问。磁盘是通过机械运动进行寻址的,连续访问不需要过多的定位,故效率比较高
MySQL与磁盘交互基本单位
MySQL作为一款应用软件,可以想象成一种特殊的文件系统。它有着更高的IO场景,所以,为了提高基本的IO效率,MySQL 进行IO的基本单位是16KB (后面统一使用InnoDB 存储引擎讲解)
mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';+------------------+-------+| Variable_name | Value |+------------------+-------+| Innodb_page_size | 16384 | -- 16*1024=16384+------------------+-------+1 row in set (0.01 sec)
磁盘这个硬件设备的基本单位是512 字节,而MySQL InnoDB引擎使用16KB 进行IO交互。即,MySQL 和磁盘进行数据交互的基本单位是16KB 。这个基本数据单元,在MySQL 这里叫做page(注意和系统的page区分)
建立共识
MySQL 中的数据文件,是以page为单位保存在磁盘当中的。
MySQL 的CURD 操作,都需要通过计算,找到对应的插入位置,或者找到对应要修改或者查询的数据。
只要涉及计算,就需要CPU参与,为了便于CPU参与,一定要能够先将数据移动到内存当中。
在特定时间内,数据一定是磁盘中有,内存中也有。后续操作完内存数据之后,以特定的刷新策略,刷新到磁盘。这时就涉及到磁盘和内存的数据交互,也就是IO了。而此时IO的基本单位就是Page。
为了更好的进行上面的操作,MySQL 服务器在内存中运行的时候,在服务器内部,就申请了被称为Buffer Pool的的大内存空间,来进行各种缓存。其实就是很大的内存空间,来和磁盘数据进行IO交互。
为了更高的效率,一定要尽可能的减少系统和磁盘IO的次数
图解IO
fsync() 函数是 Unix 和类 Unix 系统(如 Linux)中用于文件 I/O 操作的一个标准函数,其原型定义在 <unistd.h> 头文件中。该函数的作用是强制将缓冲区中的数据写入到文件中,并确保文件的元数据(如修改时间和访问权限)也被更新到磁盘上。这对于确保数据的完整性和一致性非常关键,尤其是在进行重要的数据写入操作后。
函数原型如下:
#include <unistd.h>
int fsync(int fd);
参数:
fd:是一个文件描述符,它标识了要同步数据的文件。这个文件描述符是通过如 open(), creat(), dup(), fcntl(), socket(), pipe() 等函数获得的。
返回值
成功时,fsync() 返回 0。
失败时,返回 -1,并设置 errno 以指示错误的原因。可能的错误包括 EBADF(无效的文件描述符)、EIO(输入/输出错误)、EROFS(文件位于只读文件系统上)等。
使用 fsync() 的场景通常是在写入关键数据到文件后,为了确保数据不会因系统崩溃或突然断电而丢失。然而,需要注意的是,fsync() 可能会降低程序的性能,因为它强制磁盘I/O操作,而这些操作通常比内存操作慢得多。因此,在使用 fsync() 时需要权衡数据一致性和性能之间的关系。
此外,还有一个类似的函数 fdatasync(),它在功能上与 fsync() 类似,但 fdatasync() 只同步文件的数据部分,而不包括文件的元数据(如修改时间)。在某些情况下,如果只需要确保文件数据的一致性而不需要同步元数据,使用 fdatasync() 可以获得更好的性能。
认识索引
建立测试表
create table if not exists user (
id int primary key, --一定要添加主键哦,只有这样才会默认生成主键索引
age int not null,
name varchar(16) not null
);
mysql> show create table user \G*************************** 1. row ***************************Table: userCreate Table: CREATE TABLE `user` (`id` int(11) NOT NULL,`age` int(11) NOT NULL,`name` varchar(16) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 --默认就是InnoDB存储引擎
1 row in set (0.00 sec)
插入多条记录 --插入多条记录,注意,并没有按照主键的大小顺序插入
mysql> insert into user (id, age, name) values(3, 18, '杨过');Query OK, 1 row affected (0.01 sec)
mysql> insert into user (id, age, name) values(4, 16, '小龙女');Query OK, 1 row affected (0.00 sec)
mysql> insert into user (id, age, name) values(2, 26, '黄蓉');Query OK, 1 row affected (0.01 sec)
mysql> insert into user (id, age, name) values(5, 36, '郭靖');Query OK, 1 row affected (0.00 sec)
mysql> insert into user (id, age, name) values(1, 56, '欧阳锋');Query OK, 1 row affected (0.00 sec)
查看插入结果
mysql> select * from user;
+----+-----+-----------+| id | age | name |+----+-----+-----------+| 1 | 56 | 欧阳锋 || 2 | 26 | 黄蓉 || 3 | 18 | 杨过 || 4 | 16 | 小龙女 || 5 | 36 | 郭靖 |+----+-----+-----------+5 rows in set (0.00 sec)--发现竟然默认是有序的!是谁干的呢?排序有什么好处呢
为何IO交互要是Page:为何MySQL和磁盘进行IO交互的时候,要采用Page的方案进行交互呢?用多少,加载多少不香吗?
如上面的5条记录,如果MySQL要查找id=2的记录,第一次加载id=1,第二次加载id=2,一次一条记录,那
么就需要2次IO。如果要找id=5,那么就需要5次IO。
如果这5条(或者更多)都被保存在一个Page中(16KB,能保存很多记录),那么第一次IO查找id=2的时候,整个Page会被加载到MySQL的Buffer Pool中,这里完成了一次IO。但是往后如果在查找id=1,3,4,5等,完全不需要进行IO了,而是直接在内存中进行了。所以,就在单Page里面,大大减少了IO的次数。
你怎么保证,用户一定下次找的数据,就在这个Page里面?我们不能严格保证,但是有很大概率,因为有局部
性原理。
往往IO效率低下的最主要矛盾不是IO单次数据量的大小,而是IO的次数。
理解单个Page
MySQL 中要管理很多数据表文件,而要管理好这些文件,就需要先描述再组织!目前可以简单理解成一个个独立文件是有一个或者多个Page构成的。mysql 内部,一定需要并存在大量的 page,也就决定了 mysql 必须要将多个同时存在的 page 管理起来!要管理所有的 mysql 内的 page,需要先描述,再组织!不要简单的将 page 认为是一个内存块,page 内部也必须写入对应的管理信息!例如我们假设将 page 描述成一个链表,那么它就类似如下结构;
struct page
{struct page*next;struct page* prev;char buffer[NUM];
};
该结构体大小就为 16KB,将所有的 page 用“链表”的形式管理起来,在 buffer pool 内部,对 mysql 的 page 进行了一个建模。不同的 Page ,在 MySQL 中,都是 16KB ,使用 prev 和 next 构成双向链表。因为有主键的问题, MySQL 会默认按照主键给我们的数据进行排序,从上面的 Page 内数据记录可以看出,数据是有序且彼此关联的。
为什么数据库在插入数据时要对其进行排序呢?我们按正常顺序插入数据不是也挺好的吗?
插入数据时排序的目的,就是优化查询的效率。页内部存放数据的模块,实质上也是一个链表的结构,链表的特点也就是增删快,查询修改慢,所以优化查询的效率是必须的。正是因为有序,在查找的时候,从头到后都是有效查找,没有任何一个查找是浪费的,而且,如果运气好,是可以提前结束查找过程的。
理解多个Page
通过上面的分析,我们知道,上面页模式中,只有一个功能,就是在查询某条数据的时候直接将一整页的数据加载到内存中,以减少硬盘IO次数,从而提高性能。但是,我们也可以看到,现在的页模式内部,实际上是采用了链表的结构,前一条数据指向后一条数据,本质上还是通过数据的逐条比较来取出特定的数据。
如果有1千万条数据,一定需要多个Page来保存1千万条数据,多个Page彼此使用双链表链接起来,而且每个Page内部的数据也是基于链表的。那么,查找特定一条记录,也一定是线性查找。这效率也太低了。
页目录
我们在看书的时候,如果我们要看<指针章节>,找到该章节有两种做法
- 从头逐页的向后翻,直到找到目标内容
- 通过书提供的目录,发现指针章节在234页(假设),那么我们便直接翻到234页。同时,查找目录的方案,可以顺序找,不过因为目录肯定少,所以可以快速提高定位.本质上,书中的目录,是多花了纸张的,但是却提高了效率所以,目录,是一种**“空间换时间的做法”**
单页情况
针对上面的单页Page,我们能否也引入目录呢?当然可以
那么当前,在一个Page内部,我们引入了目录。比如,我们要查找id=4记录,之前必须线性遍历4次,才能拿到结果。现在直接通过目录2[3],直接进行定位新的起始位置,提高了效率。
现在我们可以再次正式回答上面的问题了,为何通过键值 MySQL会自动排序?
可以很方便引入目录
多页情况
MySQL中每一页的大小只有 16KB,单个Page大小固定,所以随着数据量不断增大,16KB不可能存下所有的数据,那么必定会有多个页来存储数据。
在单表数据不断被插入的情况下,MySQL会在容量不足的时候,自动开辟新的Page来保存新的数据,然后通过指针的方式,将所有的Page组织起来:
需要注意,上面的图是理想结构,目前要保证整体有序,那么新插入的数据,不一定会在新Page上面,这里仅仅做演示。
这样,我们就可以通过多个Page遍历,Page内部通过目录来快速定位数据。可是,貌似这样也有效率题,在Page之间,也是需要mySQL遍历的,遍历意味着依旧需要进行大量的I0,将下一个Page加载到内存,进行线性检测。这样就显得我们之前的Page内部的目录,有点杯水车薪了。
那么如何解决呢?
解决方案,其实就是我们之前的思路,给Page也带上目录.使用一个目录项来指向某一页,而这个目录项存放的就是将要指向的页中存放的最小数据的键值。
和页内目录不同的地方在于,这种目录管理的级别是页,而页内目录管理的级别是行。
其中,每个目录项的构成是:键值+指针。
存在一个目录页来管理页目录,目录页中的数据存放的就是指向的那一页中最小的键值数据。有数据,就可
通过比较,找到该访问那个Page,进而通过指针,找到下一个Page。
其实目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。
可是,我们每次检索数据的时候,该从哪里开始呢?
虽然顶层的目录页少了,但是还要遍历啊?不用担心,可以在加目录页:
⇒ 传说中的B+树啊!没错,至此,我们已经给我们的表user构建完了主键索引。
随便找一个id=?我们发现,现在查找的Page数一定减少了,也就意味着IO次数减少了,那么效率也就提高了。
复盘
Page分为目录页和数据页。目录页只放各个下级Page的最小键值。
查找的时候,自顶向下找,只需要加载部分目录页(根节点到目标叶子节点的路径结点)到内存,即可完成算法的整个查找过程,大大减少了10次数
InnoDB 在建立索引结构来管理数据的时候,其他数据结构为何不行?
- 链表?线性遍历
- 二叉搜索树?瘦高,中间结点比B+多–需要更多IO(数据从磁盘加载到内存)退化问题,可能退化成为线性结构
- AVL &&红黑树?虽然是平衡或者近似平衡,但是毕竟是二叉结构,相比较多阶B+,意味着树整体过高,大家都是自顶向下找,层高越低,意味着系统与硬盘更少的IO Page交互。虽然你很秀,但是有更秀的。
- Hash?官方的索引实现方式中,MySQL 是支持HASH的,不过InnoDB 和MyISAM 并不支持.Hash跟进其算法特征,决定了虽然有时候也很快(O(1)),不过,在面对范围查找就明显不行,另外还有其他差别,有兴趣可以查一下。
- B树?最值得比较的是 InnoDB 为何不用B树作为底层索引?数据结构演示链接
总结:
索引的本质就是数据结构 B+树;
叶子节点保存有效数据,路上节点不保存数据,非叶子节点不要数据,只保存目录项;
非叶子节点不存数据,那么就说明能存储更多的目录项,可以管理更多的叶子 Page,所以这棵树一定是一个 “矮胖型” 的树!
每一个节点都有目录项,可以大大提高搜索效率;
这颗 “矮胖型” 的树代表我们查询过程中,途径的路上节点减少,说明目标数据只需要更少的 Page,就说明 IO 次数更少,在 IO 层面,提高了效率!
第四点和第五点加起来整体就提高了搜索的效率!
查找的时候,自定向下找,只需要加载部分目录页到内存,即可完成算法的整个查找过程,大大减少了 IO 次数。
B树vsB+树
B树节点,既有数据,又有Page指针。叶子节点不连。
B+,只有叶子节点有数据,其他目录页,只有键值和Page指针,叶子节点全部相连
为何选择B+
节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少。
叶子节点相连,更便于进行范围查找。
相关文章:
【MySQL】索引 【上】 {没有索引的查询/磁盘/mysql与磁盘IO/初识索引}
文章目录 1.没有索引存在的问题2. 认识磁盘MySQL与存储MySQL与磁盘交互基本单位建立共识图解IO认识索引 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物…...
GO goroutine状态流转
Gidle -> Grunnable newproc获取新的goroutine,并放置到P运行队列中 这也是go关键字之后实际编译调用的方法 func newproc(fn *funcval) {// 获取当前正在运行中的goroutinegp : getg()// 获取调用者的程序计数器地址,用于调试和跟踪pc : getcallerp…...
DLMS/COSEM中的信息安全:DLMS/COSEM安全概念(上)
DLMS/COSEM中的信息安全描述并规定: ——DLMS/COSEM安全概念; ——选择加密算法; ——安全密钥; ——使用加密算法进行实体认证、xDLMS APDU保护和COSEM数据保护。 1.综述 DLMS/COSEM服务器的资源(COSEM对象属性和方法)可以由在应用连接内的DLMS/COSEM客户机访问。 在AA…...
C语言第九天笔记
数组的概念 什 么是数组 数组是 相同类型, 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…...
智慧环卫可视化:科技赋能城市清洁管理
图扑智慧环卫可视化通过实时监控、数据分析和智能调度,提高环卫作业效率,优化资源配置,提升城市清洁水平,实现城市管理的精细化和现代化。...
【力扣】SQL题库练习5
高级查询和连接 1341.电影评分 表:Movies ------------------------ | Column Name | Type | ------------------------ | movie_id | int | | title | varchar | ------------------------ movie_id 是这个表的主键(具有唯一值的列)。 ti…...
永结无间Ⅸ--你不需要LLM Agent
人们将目光锁定在下一个闪亮的事物上。FOMO 是人性的一部分。这也适用于企业。就像数据科学成为每个企业分析功能的热潮一样,Agentic Architecture 是大多数 AI 雷达上的热门目标。 但您是否考虑过您是否真的需要它? 实际情况是,您不需要 A…...
Simulink|基于粒子群算法的永磁同步电机多参数辨识
目录 主要内容 模型研究 结果一览 下载链接 主要内容 仿真程序参考文献《改进粒子群算法的永磁同步电机多参数辨识》,采用粒子群算法与simulink模型结合的方式,对永磁同步电机进行多参数辨识。程序以定子绕组电阻、d轴电感、q轴电感和永磁…...
程序如何自动点击亚马逊商户后台的“邀请评论”按钮
要在亚马逊上自动点击“邀请评论”按钮,可以使用自动化脚本来实现。由于你希望自动化操作,我提供一个示例代码,使用 Selenium WebDriver 来执行这个任务。Selenium 是一个流行的浏览器自动化工具,能够模拟用户操作,例如…...
大模型算法面试题(十八)
本系列收纳各种大模型面试题及答案。 1、P-tuning v2 思路、优缺点是什么 P-tuning v2是清华大学自然语言处理实验室(THUDM)等研究机构提出的一种新的预训练模型优化方法,主要关注如何通过动态构建任务相关的提示序列来引导预训练模型进行更…...
手机在网状态接口如何对接?(二)
一、什么是手机在网状态? 传入手机号码,查询该手机号的在网状态,返回内容有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态使用场景? 1.用户验证与联系…...
力扣-3232. 判断是否可以赢得数字游戏
给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums 中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 Alice 获胜。 如果 Alice 能赢得这场游…...
Table SQL connectors以及FileSystem、JDBC connector
目录 Flink支持的连接器 如何使用连接器 FileSystem SQL Connector 文件格式 分区文件 Source 目录监控 元数据 Streaming Sink 滚动策略 文件合并 JDBC SQL Connector 依赖 如何创建JDBC表 连接器配置 案例 pom依赖 代码 测试 Flink的Table API和SQL…...
Animate软件基础:“分散到图层”创建的新图层
FlashASer:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer:实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.co…...
ffmpeg命令-Windows下常用最全
查询命令 参数 说明 -version 显示版本。 -formats 显示可用的格式(包括设备)。 -demuxers 显示可用的demuxers。 -muxers 显示可用的muxers。 -devices 显示可用的设备。 -codecs 显示libavcodec已知的所有编解码器。 -decoders 显示可用…...
反序列化漏洞靶机实战-serial
一.安装靶机 下载地址为https://download.vulnhub.com/serial/serial.zip,安装好后开启靶机,这里并不需要我们去登录,直接扫描虚拟机nat模式下c网段的ip,看看哪个的80端口开放,然后直接去访问 二.查找cookie 访问靶…...
医疗器械产品没有互联网连接,就不适用于网络安全要求吗?
医疗器械产品是否不适用于网络安全要求,需要考虑产品是否具有网络连接功能以进行电子数据交换或远程控制,以及是否采用储存媒介进行电子数据交换。详细解析如下: 一、医疗器械的网络安全要求不仅限于互联网连接 数据交换接口:医疗…...
可视掏耳勺安全吗?独家揭示六大风险弊病!
很多人习惯在洗漱完顺手拿一根棉签掏耳朵,但是棉签的表面直径大且粗糙,不易将耳朵深处的耳垢挖出,耳垢堆积在耳道深处长时间不清理会导致堵塞耳道,引起耳鸣甚至感染。而可视掏耳勺作为一种新型的挖耳工具,它的安全性也…...
JavaScript 变量声明var、let、const
在 JavaScript 中,var、let和const是用于声明变量的关键字。 let和const是JavaScript里相对较新的变量声明方式。 let用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 const声明一个只读的常量。一旦声明,常量的…...
ipvlan: operation not supported 导致的POD不断重启
情况描述 接到反馈有一台虚拟机HA迁移了,需要检查一下上面业务是否正常,由于是K8S node节点,正常情况下重启会自动恢复的,不过抱着严谨的态度,上去看了一眼。 问题:发现docker运行正常,但是业…...
组蛋白乳酸化和RNA甲基化如何联动?请大数据把这个思路推给科研人
在细胞生物学中,基因表达调控是决定细胞功能与命运的核心过程之一。组蛋白作为修饰性蛋白,在调控基因转录中起着至关重要的作用。近年来,科学家们发现,组蛋白的多种化学修饰(如甲基化、乙酰化、磷酸化等)影…...
操作文件-Path
Java操作文件-Path Paths 参数说明 first:必选参数,表示路径的第一个组件。more:可选参数,表示路径的其他组件,可以传入多个。 创建路径对象 // 创建一个表示当前工作目录的Path对象 Path currentPath Paths.get…...
RAC(Teamcenter )开发,Bom行解包和打包的方法
1、打包 UnpackAllAction allAction new UnpackAllAction((AbstractBOMLineViewerApplication) currentApplication, "packAllAction"); new Thread(allAction).start();2、解包 UnpackCommand command new UnpackCommand(bomLine); command.executeModal();3、注…...
log4j2漏洞练习
log4j2 是Apache的一个java日志框架,我们借助它进行日志相关操作管理,然而在2021年末log4j2爆出了远程代码执行漏洞,属于严重等级的漏洞。apache log4j通过定义每一条日志信息的级别能够更加细致地控制日志生成地过程,受影响的版本…...
OpenEuler安装部署教程
目录 OpenEuler安装部署教程 MobaXterm一款全能的远程工具 yum安装软件 vim编辑器(了解) 防火墙 常用命令 网络工具netstat & telnet 进程管理工具top ps 磁盘free、fdisk 用户、组(了解) 权限(了解&am…...
Canto - hackmyvm
简介 靶机名称:Canto 难度:简单 靶场地址:https://hackmyvm.eu/machines/machine.php?vmCanto 本地环境 虚拟机:vitual box 靶场IP(Canto):192.168.130.53 windows_IP:192.1…...
【数据结构进阶】手撕红黑树
🔥个人主页: Forcible Bug Maker 🔥专栏: C || 数据结构 目录 🌈前言🔥红黑树的概念🔥手撕红黑树红黑树结点的定义红黑树主体需要实现的成员函数红黑树的插入findEmpty和Size拷贝构造析构函数和…...
【C++从小白到大牛】类和对象
目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 类的成员函数两种定义方式: 1. 声明和定义全部放在类体中 2. 类声明放在.h文件中,成员函数定义放在.cpp文件中 成员变量命名规则的建议: 四、类的访问限定符 【访问限…...
Kafka 为什么这么快的七大秘诀,涨知识了
我们都知道 Kafka 是基于磁盘进行存储的,但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点,其吞吐量动辄几十上百万。 在座的靓仔和靓女们是不是有点困惑了,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间。…...
一文解决3D车道线检测:最新单目3D车道线检测综述
前言 场景理解是自动驾驶中极具挑战的任务,尤其是车道检测。车道是道路分割的关键,对车辆安全高效行驶至关重要。车道检测技术能自动识别道路标记,对自动驾驶车辆至关重要,缺乏这项技术可能导致交通问题和事故。车道检测面临多种…...
小米路由器 wordpress/优化网络
http://blog.csdn.net/qwe6112071/article/details/50991563 Quartz框架需求引入 在现实开发中,我们常常会遇到需要系统在特定时刻完成特定任务的需求,在《spring学习笔记(14)引介增强详解:定时器实例:无侵入式动态增强类功能》&a…...
适合ps做图的素材网站/微信推广加人
一、Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式。 它基…...
深圳龙岗网络科技有限公司/高级seo培训
Spring Cloud Gateway 为 SpringBoot 应用提供了API网关支持,具有强大的智能路由与过滤器功能,本文将对其用法进行详细介绍。SpringCloud实战电商项目mall-swarm(5.1kstar)地址:https://github.com/macrozheng/mall-sw…...
哪里有做区块链网站的/seo长尾关键词
php如何安装gd扩展_后端开发php安装gd扩展的方法:首先安装相关依赖;然后通过“make install”命令安装gd扩展;接着打开“php.ini”文件添加一行“gd.so”;最后重启“php-fpm”服务即可。php内存不够的解决办法:1、修改…...
wordpress空间安装教程/百度网盘提取码入口
在继续学习之前,你需要对下面的知识有基本的了解 1.HTML/XHTML 2.CSS 3.JavaScript/DOM 什么是AJAX? AJAX异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意…...
室内装修网站/互联网项目推广平台有哪些
API概述以及Object类的概述 API(Application Programming Interface) 应用程序编程接口,即Java提供给我们使用的类,这些类将底层的实现封装了起来, 我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。 Object类概述:…...