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

面试突击---MySQL索引

面试突击---MYSQL索引

    • 面试表达技巧:
    • 1、谈一下你对于mysql索引的理解?(为什么mysql要选择B+树来存储索引)
    • 2、索引有哪些分类?
    • 3、聚簇索引与非聚簇索引
    • 4、回表、索引覆盖、最左匹配原则、索引下推
      • (1)回表
      • (2)索引覆盖
      • (3)最左匹配原则
      • (4)索引下推(Index Condition Pushdown, ICP)
    • 5、如何设计性能优良的索引?
    • 6、什么情况下会造成索引失效?
    • 7、主键为什么建议选择自增主键?
    • 8、如何查看SQL语句是否使用索引
        • id
        • select_type
        • table
        • type
        • possible_keys
        • key
        • key_len
        • ref
        • rows
        • filtered
        • extra

面试表达技巧:

1、回答任何问题的时候不要着急给出答案,先把面试官的问题听清楚

2、听到问题无论是自己会的问题还是不会的问题,先在脑海里想一两秒中,把要说的话做一个梳理

3、回答任何问题的时候要有条理,如果不知道怎么回答就按照总分或者总分总的方式来说

4、面试中遇到自己不会的问题不要慌,知道多少说多少,实在搞不定的大方承认自己没有接触过,不要顾左右而言他

1、谈一下你对于mysql索引的理解?(为什么mysql要选择B+树来存储索引)

mysql的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单点来说就是可以保证在树的高度不变的情况下可以存储更多的数据:

​ 1、在MYSQL的数据库中,表的真实数据和索引数据都是存储在磁盘中,我们在进行数据读写的时候必然涉及到IO的问题,IO本质上来说是硬件方面的问题,但是我们在做索引设计的时候肯定要尽可能的考虑如何提高IO的效率,一般来说,提高IO效率主要有两个维度的考虑,减少IO次数和减少IO量,所以要遵循这两个原则

​ 2、我们在进行数据存储的时候量是没办法预估的,当表的数据量非常大的时候,我们是没有办法一次性将所有的数据都读取到内存中,因此这个时候就要采用分治的思想,将数据进行分块读取,一旦分块读取的话,我们就要考虑设计合理的块大小

​ 3、数据在磁盘存储的时候有时间局部性和空间局部性的特性,内存跟磁盘在进行数据交互的时候也不是需要啥就读取啥,而是会把相关的数据全部都加载到内存中,在进行加载的时候有一个最基本的逻辑单位称之为页,页的大小一般是4KB或者8KB,跟操作系统相关,我们在数据读取的时候一般会选择页的整数倍读取,比如innodb存储引擎每次读取16KB的大小。这个特性刚刚好跟我们上述说的分块读取的设计观念吻合起来,因此块的大小会选择页的整数倍,在MYSQL中一般都是16KB的大小,当然也可以通过参数来进行调整,比如innodb中的innodb_page_size这个参数,当然一般情况下我们不会调整这个参数的大小

​ 4、当块的大小确定了之后我们就要考虑数据格式了,我们在使用索引的时候基本是根据某一个或者多个索引列的值来进行整行数据或者部分字段的读取,比如select * from table where id = 10这个语句就是根据id的值去检索整行记录,因此整体的数据格式可以设计为K-V格式的数据,K值就是索引列的值,V值的设计就需要进一步思考了。

​ 5、正常情况下,当需要从磁盘中读取某一行记录的时候,需要知道一些信息才能够定位到数据,比如:文件名称,偏移量,数据长度,当知道这些信息的时候就可以定位到任何一行记录,所以我们可以将V的值设计为刚刚的几个字段,但是要考虑一件事,如果将刚刚的那些信息作为索引信息的话,那么在进行数据读取的时候,首先要打开一个文件,读取到刚刚的那几个字段信息,然后再根据那些信息找到对应的数据文件读取具体的行数据,如果打开一次文件就是一次IO的话,至少需要2次IO操作才可以读取,这个跟我们上面所说的减少IO次数有点相违背,所以最好的方式是在V中直接将行记录进行存储,那么在读取数据的时候就可以直接根据K值读取到行记录,只不过此时需要将数据跟索引绑定存储,在MYSQL中,innodb存储引擎就是这样存储的,数据文件和索引文件全部位于后缀名为ibd的文件中

​ 6、当数据格式确定了之后我们就需要思考使用什么数据结构存储了。支持K-V格式的数据结构有很多,比如哈希表,二叉树,BST,AVL,红黑树,但是MYSQL最终选择了B+树,下面我们要对比下各个数据结构之间的区别:

​ (1)使用哈希表可以进行数据存储,但是哈希表本质是无序散列表,因此在进行范围查询的时候就必须要挨个进行数据的对比,此时的效率是比较低的,此外,哈希表会存在哈希碰撞或者哈希冲突的问题,需要设计性能优良的哈希算法,因此哈希表并不适用,但是在MYSQL中,MEMORY存储引擎支持哈希索引,innodb存储引擎支持自适应哈希,

​ (2)二叉树、BST、AVL、红黑树这几种树也可以支持K-V格式的数据存储,但是它们有一个共同的特点就是至多只有两个分支,那么在进行数据存储的时候,一个三层的树至多可以存储7个数据结果值,这个数据太少了,如果想要存储更多的数据,只能把树的高度变高,而树的高度变高之后又会导致IO的次数变多,影响查询效率,那么我们就要思考如何在保证树的高度不变的情况下存储更多的数据,上述的这些树存储数据少的原因在于分支至多只有两个,那么我们就要思考改变分支的结构了,因此有了B-树。

​ (3)使用B-树之后,存储如下图所示:在每一个数据块中包含三种类型的数据,分别是key值,行记录和指针,当需要进行数据读取的时候只要一层一层向下检索即可:

在这里插入图片描述

​ 在上图中,如果要读取28这条记录的话,那么只需要读取磁盘块1,3,8就可以把数据取出来,如果一个磁盘块大小是16KB的话,那么读取48KB的数据就可以获取到要查询的记录,此时我们就要思考,这样3层的B-树存满的情况下可以存储多少条记录了,假设一条记录是1KB的大小,那么第一层至多存储15条记录,第二层至多存储16(第二层的子节点个数)*15(每个节点可以存储的行记录树)=240条记录,第三层至多存储16*16*15=3840条记录,那么三层的树存满的情况下最多存储15+240+3840=4095条记录,此时存储的数据量依然不是很大,如果想要存储更多的数据的话就只能将树变高,变成4层或者5层,那么此时又会增加IO的次数,会影响查询效率,那么此时就要思考为何只能存储这么少的数据,经过分析之后发现,data占用了大量的空间,因此考虑使用B+树进行数据的存储

​ (4)使用B+树之后,存储如下图所示:将所有的data全部放到了叶子节点中,非叶子节点中只存储key值和指针的值,在进行检索的时候可以从根节点向下检索,也可以在叶子节点中从前向后或者从后向前检索:

在这里插入图片描述

​ 在上图中,所有的data都在叶子节点中,也就说第一层和第二层省掉了大量的data的存储空间,那么可以存储更多的数据,假设一个data还是1KB的大小,一个key加上一个指针的大小为10个字节,那么我们可以来计算下可以存储多少数据,第一层一个数据块,第二层16*1024/10=1638个数据块,第三层1638**16*1024\10=2683044个数据块,第三层的每个数据块可以存储16条记录,那么最后的总记录数为42928704条记录,可以发现跟B-树的存储不是一个量级,在相同树高的情况下,B+树可以存储更多的数据

​ 因此MYSQL最终选择了B+树做为数据结构来存储,在刚刚上述的计算公式中,我们做了一个假设,key+指针一共占了10个字节,如果占用100个字节的话,那么整体的数据会缩小2个量级,因此在回答索引的树的高度的时候不要说3层或者4层,给一个标准说法:一般情况下,3-4层的B+树足以支撑千万级别的数据量存储。

2、索引有哪些分类?

​ 索引的分类要按照不同的角度去进行分类:

​ 1、从数据结构的角度可以分为B+树索引哈希索引FULLTEXT索引R-Tree索引(用于对GIS数据创建SPATIAL索引)

​ 2、从物理存储的角度可以分为聚簇索引非聚簇索引

​ 3、从逻辑角度可以分为主键索引普通索引唯一索引组合索引

3、聚簇索引与非聚簇索引

在这里插入图片描述

​ 在MYSQL的innodb存储引擎中,数据在进行插入的时候必须要跟某一个索引列绑定在一起进行存储,如果有主键,那么选择主键,如果没有主键,那么选择唯一键,如果没有唯一键,那么系统会生成一个6字节的rowid进行存储,因此:

​ 跟数据绑定存储的索引称之为聚簇索引

​ 没有跟数据绑定存储的索引称之为非聚簇索引

​ 一张表中只有一个聚簇索引,其他非聚簇索引的叶子节点中存储的值为聚簇索引的列值

4、回表、索引覆盖、最左匹配原则、索引下推

(1)回表

​ 回表表示使用非聚簇索引时,数据库引擎会先根据普通索引找到匹配的行,然后根据叶子节点中存储的聚簇索引的值去聚簇索引的索引树中查找整行记录的过程。例如:

​ 有一张表有如下字段:id,name,age,gender,address,其中id是主键,name是普通索引

​ 那么要进行如下SQL语句的查询:

select * from table where name = 'zhangsan';

​ 上述SQL语句的查找过程是:先根据name的值去name的索引树上进行检索,找到匹配的记录之后取出id的值,然后再根据id的值去id的B+树上检索整行的记录,在这个过程中,查找了两棵树,多进行了棵树的IO,因此效率比较低,在生产环境中应该尽量避免回表

(2)索引覆盖

​ 索引覆盖是指一个索引包含了查询所需要的所有数据,从而在查询中无需回表从原表中获取数据

​ 假设有一张表,表中有以下字段:id,name,age,gender,address,其中id是主键,name是普通索引

​ 那么要进行如下SQL语句的查询:

select id,name from table where name = 'zhangsan';

​ 查找过程如下:在name的索引树上包含了要查询的所有字段,所以直接通过name字段去name的B+树上检索对应的记录即可,不需要找到id之后再去id的B+树上检索数据

​ 索引覆盖可以提高查询的性能,所以在生产环境做SQL优化的时候,可以考虑索引覆盖

(3)最左匹配原则

最左匹配原则主要适用于组合索引,指的是多个列值进行匹配的时候要严格遵循从左到右的顺序,否则会导致索引失效

假设有一张表,表中有以下字段:id,name,age,gender,address
id是主键,(name,age)是组合索引1Select * from table where name = 'zhangsan' and age = 10;
2Select * from table where name = 'zhangsan';
3Select * from table where age = 10;
4Select * from table where age = 10 and name = 'zhangsan';

上述的四条语句中,1,2,4都可以用到组合索引,3用不到,但是很多同学会有疑问,为什么第四条会用到,明明不符合最左匹配原则的顺序,这里需要注意,如果把第四条SQL语句的条件换一下顺序,会影响最终的查询结果吗?答案是不会的,所以mysql中的优化器会进行优化,调整条件的顺序

(4)索引下推(Index Condition Pushdown, ICP)

​ ICP是针对mysql使用索引从表中检索行的情况进行优化,如果没有ICP,那么存储引擎会根据索引来定位到记录,然后将结果返回给mysql的server,然后在server上对where条件进行筛选。在启用ICP之后,如果where条件的一部分可以通过使用索引中的列来求值,那么mysql会把这部分的where条件筛选下推到存储引擎中。

​ 使用索引下推的时候会有以下的条件:

​ 1、当需要访问完整的行记录时,ICP用于range、ref、eq_ref和ref_or_null访问方法

​ 2、ICP可以用于innodb和myisam表,包括分区的innodb表和myisam表

​ 3、对于innodb表,ICP仅用于二级索引。ICP的目标是减少整行读取的次数,从而减少IO操作

​ 4、在虚拟列上创建的二级索引不支持ICP

​ 5、引用子查询的条件不能下推

​ 6、引用存储函数的条件不能下推

​ 7、触发器条件不能下推

​ 8、不能将条件下推到包含对系统变量引用的派生表中

​ 假设有一张表,表中有以下字段:id,name,age,gender,address,其中id是主键,(name,age)是组合索引

select * from table where name = 'zhangsan' and age = 10;

​ 没有索引下推:mysql执行这条SQL语句的时候,会首先根据name的值去存储引擎中拉取数据,然后将数据返回到mysql server,然后在server层对age进行条件过滤,把符合条件的结果返回给客户端
​ 有索引下推:mysql执行这条SQL语句的时候,会直接根据name和age的值去存储引擎中拉取数据,而无需在server层对数据进行条件过滤

​ 所谓的下推指的是将条件的筛选从server层下推到存储引擎层

​ 可以通过optizizer_switch中的index_condition_pushdown条件来是否开启,默认是开启的

# 关闭
SET optimizer_switch = 'index_condition_pushdown=off';
# 开启
SET optimizer_switch = 'index_condition_pushdown=on';

5、如何设计性能优良的索引?

​ 1、索引列占用的空间越小越好

​ 2、选择索引列的时候尽量选择离散度高的列作为索引列,离散度的计算公式count(distinct(column_name)) / count(*),这个值越大,那么越适合做索引

​ 3、在where后的order by字段上添加索引,如果有where条件,是跟where条件一起创建,如果没有就只是order by

​ 4、在join on的条件字段上添加索引

​ 5、索引的个数不要过多,会增加索引的维护成本

​ 6、频繁更新的字段,不要创建索引,会增加索引的维护成本

​ 7、随机无序的值,不建议作为主键索引,如身份证号,UUID

​ 8、索引列在设计的时候最好不为NULL

​ 9、可以使用列前缀作为索引列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上面三张图中可以看出使用列前缀7个字符和8个字符就一样了,而且非常接近使用整个字段分组的结果了,所以可以使用列前缀7个字符创建索引最合适,如下图:
在这里插入图片描述

6、什么情况下会造成索引失效?

​ 1、索引列上使用函数(replace\SUBSTR\CONCAT\sum count avg)、表达式

​ 2、数据类型不匹配,当查询条件的数据类型和索引字段的类型不匹配

​ 3、like 条件中前面带%

​ 4、在组合索引中,不满足最左匹配原则

​ 5、使用is not null

​ 6、mysql的优化器在进行分析的时候发现全表扫描比使用索引快的时候

​ 7、使用or关键字会导致索引失效

7、主键为什么建议选择自增主键?

​ 如果选择自增主键的话,每次新增数据时,都是以追加的形式进行存储,在本页索引写满之后,只需申请一个新页继续写入即可,不会产生页分裂问题

​ 如果说采用业务字段作为主键的话,新增数据不一定是顺序的,需要挪动数据,页快满时还要去分裂页,保持索引的有序性,造成写数据成本较高

8、如何查看SQL语句是否使用索引

​ 通过执行计划可以判断查询中是否用到了索引,以便进行SQL优化。

explain语句提供了mysql如何执行语句的信息,explain可以跟select、delete、insert、replace、update语句一起工作

ColumnJSON NameMeaning
idselect_idThe SELECT identifier
select_typeNoneThe SELECT type
tabletable_nameThe table for the output row
partitionspartitionsThe matching partitions
typeaccess_typeThe join type
possible_keyspossible_keysThe possible indexes to choose
keykeyThe index actually chosen
key_lenkey_lengthThe length of the chosen key
refrefThe columns compared to the index
rowsrowsEstimate of rows to be examined
filteredfilteredPercentage of rows filtered by table condition
ExtraNoneAdditional information
id

select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序

id号分为三种情况:

​ 1、如果id相同,那么执行顺序从上到下;

​ 2、如果id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行;

​ 3、id相同和不同的,同时存在:相同的可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行

select_type

主要用来分辨查询的类型,是普通查询还是联合查询还是子查询

select_type ValueJSON NameMeaning
SIMPLENoneSimple SELECT (not using UNION or subqueries)
PRIMARYNoneOutermost SELECT
UNIONNoneSecond or later SELECT statement in a UNION
DEPENDENT UNIONdependent (true)Second or later SELECT statement in a UNION, dependent on outer query
UNION RESULTunion_resultResult of a UNION.
SUBQUERYNoneFirst SELECT in subquery
DEPENDENT SUBQUERYdependent (true)First SELECT in subquery, dependent on outer query
DERIVEDNoneDerived table
DEPENDENT DERIVEDdependent (true)Derived table dependent on another table
MATERIALIZEDmaterialized_from_subqueryMaterialized subquery
UNCACHEABLE SUBQUERYcacheable (false)A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query
UNCACHEABLE UNIONcacheable (false)The second or later select in a UNION that belongs to an uncacheable subquery (see UNCACHEABLE SUBQUERY)

1、simple: 简单的查询,不包含子查询和union

explain select * from emp;

2、primary: 查询中最外层的查询,如果查询中有子查询,则最外层的查询被标记为primary

explain select * from emp where ename not in (select ename from emp where ename like '%S%') ;

3、union: 若第二个select出现在union之后,则被标记为union

explain select * from emp where deptno = 10 union select * from emp where sal >2000;

4、dependent union: 跟union类似,此处的depentent表示union或union all联合而成的结果会受外部表影响

explain select * from emp e where e.empno  in ( select empno from emp where deptno = 10 union select empno from emp where sal >2000)

5、union result: 表示一个union的结果集作为一个单独的表返回,这通常发生在union操作之后,并且可能跟其他表进行join操作

explain select * from emp where deptno = 10 union select * from emp where sal >2000;

6、subquery: 在查询中作为另一个查询的子查询的查询,例如,在 SELECT ... WHERE column IN (SELECT ...) 结构中的子查询。

explain select * from emp where sal > (select avg(sal) from emp) ;

7、dependent subquery: 与subquery类似,但是这个查询依赖于外部查询的某些部分。

explain select e.empno,e.ename,e.sal from emp e where e.sal < (select e2.sal from emp e2 where e2.empno = e.mgr)

8、derived: 出现在from子句中的子查询,MySQL会为这个子查询生成一个临时表。这个值表示该查询是为派生表生成的。

explain select t.job from (select min(sal) min_sal,job from emp group by job) t where t.min_sal > 2500 ;

9、dependent derived:与derived类似,但是这个查询依赖于外部查询的某些部分:未找到案例

10、materialized:表示该子查询的结果被物化(即存储在临时表中),以供稍后的join使用,这种类型的子查询在执行时比常规子查询要慢,

EXPLAIN select * from emp where deptno in (select deptno from (select min(sal) min_sal,deptno from emp group by deptno) a where min_sal < '2000') ;

11、UNCACHEABLE SUBQUERY:一个子查询的结果不能被缓存,因此每次都会重新计算:未找到案例

12、UNCACHEABLE UNION: 一个union的结果不能被缓存,因此每次都会重新计算:未找到案例

table

对应行正在访问哪一个表,表名或者别名,可能是临时表或者union合并结果集
1、如果是具体的表名,则表明从实际的物理表中获取数据,当然也可以是表的别名

​ 2、表名是derivedN的形式,表示使用了id为N的查询产生的衍生表

​ 3、当有union result的时候,表名是union n1,n2等的形式,n1,n2表示参与union的id

type

type显示的是访问类型,访问类型表示我是以何种方式去访问我们的数据,最容易想的是全表扫描,直接暴力的遍历一张表去寻找需要的数据,效率非常低下,访问的类型有很多,效率从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般情况下,得保证查询至少达到range级别,最好能达到ref

1、all: 全表扫描,一般情况下出现这样的sql语句而且数据量比较大的话那么就需要进行优化。

explain select * from emp;

2、index:全索引扫描这个比all的效率要好,主要有两种情况,一种是当前的查询时覆盖索引,即我们需要的数据在索引中就可以索取,或者是使用了索引进行排序,这样就避免数据的重排序

explain  select empno from emp;

3、range:表示利用索引查询的时候限制了范围,在指定范围内进行查询,这样避免了index的全索引扫描,适用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()

explain select * from emp where empno between 7000 and 7500;

4、index_subquery:跟unique_subquery类型,使用的是辅助索引

# 测试前先关闭优化器
SET optimizer_switch='materialization=off';
# 查看执行计划
EXPLAIN select * from emp where ename not in (select dname from dept where dname like '%SALES' );
# 打开优化器
SET optimizer_switch='materialization=on';

5、unique_subquery:子查询的结果由聚簇索引或者唯一索引覆盖

--dept表的deptno字段有主键
SET optimizer_switch='materialization=off';
EXPLAIN select * from emp where deptno not in (select deptno from dept where deptno >20 );
SET optimizer_switch='materialization=on';

6、index_merge:索引合并,在where条件中使用不同的索引字段

--ename,deptno都创建索引
explain select * from emp where ename='SMITH' or deptno = 10;

7、ref_or_null:跟ref类似,在ref的查询基础上,加一个null值的条件查询

explain select * from emp  where ename = 'SMITH' or ename is null;

8、ref:使用了非聚集索引进行数据的查找

alter table emp add index idx_name(ename);
explain select * from emp  where ename = 'SMITH';

9、eq_ref :使用唯一性索引进行数据查找

explain select * from emp e,emp e2 where e.empno = e2.empno;

10、const:这个表至多有一个匹配行,

explain select * from emp where empno = 7369;

11、system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现

possible_keys

​ 显示可能应用在这张表中的索引,一个或多个,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

explain select * from emp where ename = 'SIMTH' and deptno = 10;
key

​ 实际使用的索引,如果为null,则没有使用索引,查询中若使用了覆盖索引,则该索引和查询的select字段重叠。

explain select * from emp where ename = 'SIMTH' and deptno = 10;
key_len

表示索引中使用的字节数,可以通过key_len计算查询中使用的索引长度,在不损失精度的情况下长度越短越好。

explain select * from emp where ename = 'SIMTH' and deptno = 10;
ref

显示了那些列或常量被用于查找索引列,这对于非唯一索引查找有效

explain select * from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10;
rows

根据表的统计信息及索引使用情况,大致估算出找出所需记录需要读取的行数,此参数很重要,直接反应的sql找了多少数据,在完成目的的情况下越少越好

explain select * from emp;
filtered

表示返回行的预估百分比,它显示了哪些行被过滤掉了,最大的值为100,这意味这没有对行进行筛选,从100开始递减的值表示过滤量在增加,rows表示预估的行数,rows*filtered表示与下表连接的行数

extra

提供查询的额外信息

1、using filesort:说明mysql无法利用索引进行排序,只能利用排序算法进行排序,会消耗额外的位置

explain select * from emp order by sal;

2、using temporary:建立临时表来保存中间结果,查询完成之后把临时表删除

explain select ename,count(*) from emp where deptno = 10 group by ename;

3、using index:这个表示当前的查询时覆盖索引的,直接从索引中读取数据,而不用访问数据表。如果同时出现using where 表名索引被用来执行索引键值的查找,如果没有,表面索引被用来读取数据,而不是真的查找

explain select deptno,count(*) from emp group by deptno limit 10;

4、using where:通常是进行全表或者全索引扫描后再用where子句完成结果过滤,需要添加索引

explain select * from emp where job='SMITH';

5、using join buffer:使用连接缓存

explain select * from t3 join t2 on t3.c1 = t2.c1;

6、impossible where:where语句的结果总是false

explain select * from emp where 1=0

相关文章:

面试突击---MySQL索引

面试突击---MYSQL索引 面试表达技巧&#xff1a;1、谈一下你对于mysql索引的理解&#xff1f;&#xff08;为什么mysql要选择B树来存储索引&#xff09;2、索引有哪些分类&#xff1f;3、聚簇索引与非聚簇索引4、回表、索引覆盖、最左匹配原则、索引下推&#xff08;1&#xff…...

关注 | 我国已对百种产品实施强制性产品认证

市场监管总局在7日举行的新闻发布会上介绍&#xff0c;该局日前发布《市场监管总局关于对商用燃气燃烧器具等产品实施强制性产品认证管理的公告》&#xff0c;对具有较高安全风险的商用燃气燃烧器具、阻燃电线电缆、电子坐便器、电动自行车乘员头盔、可燃气体探测报警产品、水性…...

虚幻引擎架构自动化及蓝图编辑器高级开发进修班

课程名称&#xff1a;虚幻引擎架构自动化及蓝图编辑器高级开发进修班 课程介绍 大家好 我们即将推出一套课程 自动化系统开发。 自动化技术在项目开发的前中后期都大量运用。如何您是一家游戏公司&#xff0c;做的是网络游戏&#xff0c;是不是经常会遇到程序员打包加部署需…...

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息&#xff1a; 发表于&#xff1a;IEEE TRANSACTIONS ON MULTIME…...

华为海思数字芯片设计笔试第六套

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…...

重绘和重排:概念、区别和应用示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…...

创建k8s deploy yaml文件的imagePullSecrets语句

镜像仓库是harbor kubectl create secret docker-registry key --docker-server192.168.0.190 --docker-usernameadmin --docker-passwordHarbor12345...

大模型预测结果导入到Doccano,人工修正预测不准的数据

背景 使用大语言模型做实体识别的实验时&#xff0c;发现大模型关于实体的边界预测一直不准。 主要原因在于当时找了很多同学标注数据&#xff0c;由于不同组同学关于实体的边界没有统一&#xff0c;故导致数据集中实体边界也没统一。 &#xff08;找太多人标&#xff0c;会有…...

python三方库_ciscoconfparse学习笔记

文章目录 介绍使用基本原理父子关系 属性ioscfg 获取配置信息,返回列表is_config_line 判断是否是配置行is_intf 判断IOSCfgLine是不是interfaceis_subintf 判断IOSCfgLine是不是子接口lineage 不知道用法is_ethernet_intf 判断IOSCfgLine是否是以太网接口is_loopback_intf 判断…...

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…...

python创建word文档并向word中写数据

一、docx库的安装方法 python创建word文档需要用到docx库&#xff0c;安装命令如下&#xff1a; pip install python-docx 注意&#xff0c;安装的是python-docx。 二、使用方法 使用方法有很多&#xff0c;这里只介绍创建文档并向文档中写入数据。 import docxmydocdocx.Do…...

MongoDB的安装配置及使用

文章目录 前言一、MongoDB的下载、安装、配置二、检验MongoDB是否安装成功三、Navicat 操作MongoDB四、创建一个集合&#xff0c;存放三个文档总结 前言 本文内容&#xff1a; &#x1f4ab; MongoDB的下载、安装、配置 &#x1f4ab; 检验MongoDB是否安装成功 ❤️ Navicat 操…...

Go学习路线

Go学习路线 文章目录 Go学习路线入门阶段一、Go基础和Goland的安装二、学习日志文件及配置文件三、学习mysql四、html&#xff0c;css&#xff0c;js快速入门五、写一个简单的前后端分离的记事本项目六、Linux快速入门七、Docker快速入门八、Git命令快速入门九、使用Docker打包…...

安全大脑与盲人摸象

21世纪是数字科技和数字经济爆发的时代&#xff0c;互联网正从网状结构向类脑模型进行进化&#xff0c;出现了结构和覆盖范围庞大&#xff0c;能够适应不同技术环境、经济场景&#xff0c;跨地域、跨行业的类脑复杂巨型系统。如腾讯、Facebook等社交网络具备的神经网络特征&…...

如何使用Git-Secrets防止将敏感信息意外上传至Git库

关于Git-Secrets Git-secrets是一款功能强大的开发安全工具&#xff0c;该工具可以防止开发人员意外将密码和其他敏感信息上传到Git库中。 Git-secrets首先会扫描提交的代码和说明&#xff0c;当与用户预先配置的正则表达式模式匹配时&#xff0c;便会阻止此次提交。该工具的优…...

Day 14 网络协议

常见网络设备&#xff1a;交换机 路由器 中继器 多协议网关&#xff08;路由器的前身&#xff09; 交换机&#xff1a;用于连接统一网络的设备&#xff0c;实现内网设备通信。 从广义上分为&#xff1a;局域网交换机&#xff0c;广域网交换机 从网络构成分为&#xff1a;接…...

msyql中SQL 错误 [1118] [42000]: Row size too large (> 8126)

场景&#xff1a; CREATE TABLE test-qd.eqtree (INSERT INTO test.eqtree (idocid VARCHAR(50) NULL,sfcode VARCHAR(50) NULL,sfname VARCHAR(50) NULL,sfengname VARCHAR(50) NULL,…… ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_general_ci;或 alter table eqtre…...

实验六 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请完成创建图片库应用&#xff0c;显示一系列预设的图片。 提供按钮来切换显示不同类别的图片。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; 1.WXML <view> <button bindtap"showAll">所有图片</but…...

Linux环境下,让Jar项目多线程部署成为可能

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux环境下&#xff0c;让Jar项目多线程部署成为可能 前言背景介绍使用sh脚本实现使用systemd来实现使用docker-compose实现 前言 在当今互联网时代&#xff0c;应用程序的高可用性和性能是至关重要…...

k8s调度场景

15个KUBERNETES调度情景实用指南 Kubernetes调度是确保集群中的Pod在适当节点上运行的关键组件。通过灵活配置调度策略&#xff0c;可以提高资源利用率、负载平衡和高可用性。 在本文中&#xff0c;我们将深入探讨一些实际的Kubernetes调度场景&#xff0c;并提供相应的配置示…...

基于小程序实现的餐饮外卖系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…...

家居网购项目(手写分页)

文章目录 1.后台管理—分页显示1.程序框架图2.编写数据模型Page.java 3.编写dao层1.修改FurnDao增加方法 2.修改FurnDaoImpl增加方法 3.单元测试FurnDaoTest 4.编写service层1.修改FurnService增加方法 2.修改FurnServiceImpl增加方法3.单元测试FurnServiceTest 5.编写DataUtil…...

goland2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Goland 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于 Go 语言的开发。它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和管理 Go 语言项目。 功能特点&#x…...

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…...

数据结构速成--栈

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…...

算法练习第15天|226.翻转二叉树

226.翻转二叉树 力扣链接https://leetcode.cn/problems/invert-binary-tree/description/ 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&am…...

C#面向对象——封装、封装案例示例

C#面向对象——封装 什么是封装? &#xff08;1&#xff09;封装是将数据和操作数据的方法&#xff08;行为&#xff09;封装在一起。 &#xff08;2&#xff09;程序中封装的体现&#xff1a;属性&#xff0c;方法&#xff0c;类&#xff0c;接口&#xff0c;命名空间&#…...

【InternLM 实战营第二期-笔记3】茴香豆:搭建你的 RAG 智能助理

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 茴香豆&#xff1a;搭建…...

Advanced RAG 03:运用 RAGAs 与 LlamaIndex 评估 RAG 应用

编者按&#xff1a;目前&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;技术已经广泛使用于各种大模型应用场景。然而&#xff0c;如何准确评估 RAG 系统的性能和效果&#xff0c;一直是业界和学界共同关注的重点问题。若无法…...

leetcode

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09; 示例 1: 输入: s "…...

Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画

最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏&#xff0c;实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。 DOTS 对角色动画支持的局限性 截止到Unity DOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS 的ba…...

react异步组件如何定义使用 标准使用方法

目录 默认导出和命名导出的格式 默认导出的组件 使用方式 命名导出的组件 使用方式 默认导出和命名导出的格式 默认导出: // person.js const person {name: Alice,age: 30 };export default person;命名导出&#xff1a; // math.js export const add (a, b) > a b; exp…...

React + Ts + Vite + Antd 项目搭建

1、创建项目 npm create vite 项目名称 选择 react 选择 typescript 关闭严格模式 建议关闭严格模式&#xff0c;因为不能自动检测副作用&#xff0c;有意双重调用。将严格模式注释即可。 2、配置sass npm install sass 更换所有后缀css为sass vite.config.ts中注册全局样式 /…...

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来&#xff0c;是因为这个网页这里是实时渲染的&#xff0c;我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …...

代码随想录:二叉树5

目录 102.二叉树的层序遍历 题目 代码&#xff08;队列实现&#xff09; 107.二叉树的层序遍历II 题目 代码 199.二叉树的右视图 题目 代码 637.二叉树的层平均值 题目 代码 102.二叉树的层序遍历 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍…...

Tomcat 获取客户端真实IP X-Forwarded-For

Tomcat 获取客户端真实IP X-Forwarded-For 代码实现&#xff1a; 在Host标签下面添加代码&#xff1a; <Valve className"org.apache.catalina.valves.RemoteIpValve" remoteIpHeader"x-forwarded-for" remoteIpProxiesHeader"x-forwarded-by&q…...

记录PS学习查漏补缺

PS学习 PS学习理论快捷键抠图PS专属多软件通用快捷键 PS学习 理论 JPEG &#xff08;不带透明通道&#xff09; PNG (带透明通道) 快捷键 抠图 抠图方式 魔棒工具 反选选中区域 CtrlShiftI&#xff08;反选&#xff09; 钢笔抠图注意事项 按着Ctrl单击节点 会出现当前节…...

Kafka 架构深入探索

目录 一、Kafka 工作流程及文件存储机制 二、数据可靠性保证 三 、数据一致性问题 3.1follower 故障 3.2leader 故障 四、ack 应答机制 五、部署FilebeatKafkaELK 5.1环境准备 5.2部署ELK 5.2.1部署 Elasticsearch 软件 5.2.1.1修改elasticsearch主配置文件 5.2…...

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…...

Excel文件转Asc文件

单个转换 import os import pandas as pdfilename (10)result01-1.xlsx df pd.read_excel(filename) # 读取Excel文件# 将数据保存为ASC格式 asc_filename os.path.splitext(filename)[0] .asc # 获取文件名并替换扩展名 with open(asc_filename, w) as file:# 写入文件…...

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…...

Webrtc 信令服务器实现

webrtc建联流程图 由上图可知&#xff0c;所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了&#xff0c;目前普遍的方式HTTP/HTTPS&#xff0c;WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS&…...

【Blockchain】连接智能合约与现实世界的桥梁Chainlink

去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果&#xff0c;即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统&#xff0c;去中心化的预言机网络有可能为智能合…...

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …...

Vue 阶段练习:记事本

将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中&#xff08;如该练习 记事本&#xff09;&#xff0c;我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…...

JavaScript判断受访域名,调用不同的js文件

比如&#xff1a;我有三个域名&#xff1a; ① dengoo.net ② jfzm.cc ③ ceeha.com 如果当前访问的是 dengoo.net 域名及域名下页面&#xff0c;则调用 a.js 如果当前访问的是 jfzm.cc 域名及域名下页面&#xff0c;则调用 b.js 如果当前访问的是 ceeha.com 域名及域名下…...

下载软件时的Ubuntu x86_64-v2、skylake、aarch64版本分别代表什么?

Ubuntu-x86_64-v2、Ubuntu-x86_64-skylake和Ubuntu-aarch64都是Ubuntu的不同版本或变种&#xff0c;它们之间的主要区别在于所支持的硬件架构和针对特定硬件的优化。 Ubuntu-x86_64-v2&#xff1a; 这是基于x86_64&#xff08;也称为AMD64或Intel 64&#xff09;架构的Ubuntu版…...

数字化社交的引擎:解析Facebook的影响力

Facebook&#xff0c;作为全球最大的社交媒体平台&#xff0c;已经深深地融入了我们的日常生活和文化中。它不仅仅是一个简单的社交工具&#xff0c;更是一个复杂的数字生态系统&#xff0c;影响着我们的社交模式、文化认同以及信息获取方式。在这篇文章中&#xff0c;我们将深…...

淘宝API商品详情数据在数据分析行业中具有不可忽视的重要性

淘宝商品详情数据在数据分析行业中具有不可忽视的重要性。这些数据为商家、市场分析师以及数据科学家提供了丰富的信息&#xff0c;有助于他们更深入地理解市场动态、消费者行为以及商品竞争态势。以下是淘宝商品详情数据在数据分析行业中的重要性体现&#xff1a; 请求示例&a…...

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台&#xff0c;具有多个下行通信接口及一个或者多个上行网络接口&#xff0c;用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后&#xff0c;实时上传主站系统&#xff0c;完成遥信、遥测等能源数据…...