二、[mysql]之Explain讲解与实战

news2024/9/22 21:36:57

目录

  • 一、了解Explain
    • 1.Explain介绍
  • 二、Explain相关字段
    • 1.partitions
    • 2.filtered
    • 3.SHOW WARNINGS命令
  • 三、Explain比较重要字段
    • 1.id
    • 2.select_type
    • 3.table
    • 4.type
    • 5.possible_keys
    • 6.key
    • 7.key_len
    • 8.ref
    • 9.rows
    • 10.Extra
  • 四、索引优化实战(遵循原则)
    • 1.全值匹配
    • 2.最左前缀法则
    • 3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
    • 4.存储引擎不能使用索引中范围条件右边的列
    • 5.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句
    • 6.mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描
    • 7.is null,is not null 一般情况下也无法使用索引
    • 8.like以通配符开头('$abc...')mysql索引失效会变成全表扫描操作
    • 9.字符串不加单引号索引失效
    • 10.少用or或in
    • 11.范围查询优化

本章内容都是mysql基于5.7版本讲解。

一、了解Explain

1.Explain介绍

EXPLAIN语句提供了有关MySQL如何执行语句的信息。EXPLAIN适用于SELECT、DELETE、INSERT、REPLACE和UPDATE语句。

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。
注意:如果from中包含子查询,仍会执行该子查询,将结果放入临时表中

官方文档


二、Explain相关字段

首先创建了三张表,如下
演员表

 CREATE TABLE `actor` (
 `id` INT(11) NOT NULL,
 `name` VARCHAR(45) DEFAULT NULL,
 `update_time` DATETIME DEFAULT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=INNODB DEFAULT CHARSET=utf8;

这些表自己插入几条数据就行。
在这里插入图片描述

电影表(增加了一个单值索引)

CREATE TABLE `film` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`)
 ) ENGINE=INNODB DEFAULT CHARSET=utf8;

演员电影关联表(增加了一个联合索引)

CREATE TABLE `film_actor` (
  `id` INT(11) NOT NULL,
  `film_id` INT(11) NOT NULL COMMENT '电影表主键',
  `actor_id` INT(11) NOT NULL COMMENT '演员表主键',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '额外增加的字段',
  PRIMARY KEY (`id`),
  KEY `idx_film_actor_id` (`film_id`,`actor_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

1.partitions

5.7版本执行explain时默认是有这个一列的,但是更早之前的版本可能没有,需要增加一个PARTITIONS 关键字。
就是我们这张表是否有分区,大多数情况都是不用的,用的话也是进行分库分表不做分区。没有分区的话就是NULL。可以忽略这个字段。

旧版本:EXPLAIN PARTITIONS SELECT * FROM `actor` WHERE id = 1;

5.7之后版本:EXPLAIN  SELECT * FROM `actor` WHERE id = 1;

在这里插入图片描述

2.filtered

5.7版本执行explain时默认是有这个一列的,但是更早之前的版本可能没有,需要增加一个EXTENDED 关键字。

旧版本:EXPLAIN EXTENDED SELECT * FROM `actor` WHERE id = 1;

5.7之后版本:EXPLAIN  SELECT * FROM `actor` WHERE id = 1;

filtered 列,是一个半分比的值,rows *filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。

3.SHOW WARNINGS命令

EXPLAIN   SELECT * FROM `actor` WHERE id = 1;
SHOW WARNINGS;

在这里插入图片描述
SHOW WARNINGS执行结果。
在这里插入图片描述

select '1' AS `id`,'Li' AS `name`,'2023-09-04 19:02:55' AS `update_time` from `org_47`.`actor` where 1

结果2,即mysql对sql语句优化过后的一个结果,这个结果可能不可以直接运行。

三、Explain比较重要字段

1.id

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

2.select_type

表示对应行是简单还是复杂的查询。

  1. simple:简单查询。查询不包含子查询和union
  2. primary:复杂查询中最外层的 select
  3. subquery:包含在 select 中的子查询(不在 from 子句中)
  4. derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)

=》sql举例=《

简单查询

EXPLAIN SELECT * FROM actor WHERE id = 1

在这里插入图片描述
包含DERIVED的查询
前提需要先关闭mysql5.7新特性对衍生表的合并优化。
未关闭之前

EXPLAIN SELECT (SELECT 1 FROM actor WHERE id = 1) FROM (SELECT * FROM film WHERE id = 1) der

在这里插入图片描述
关闭mysql5.7新特性对衍生表的合并优化

SET SESSION optimizer_switch='derived_merge=off';
EXPLAIN SELECT (SELECT 1 FROM actor WHERE id = 1) FROM (SELECT * FROM film WHERE id = 1) der

在这里插入图片描述
id越大越先执行,如果id值相等则按照行顺序执行。
从这个例子结合3.table看,可以看出,mysql先去查询film表中数据,然后去子查询actor表,最后进行衍生表(临时表)查询。

3.table

这一列表示 explain 的一行正在访问哪个表。
当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查
询。当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。
例如上方例子中,其中3依赖id中的3。
在这里插入图片描述

4.type

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref。

  • NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可
    以单独查找索引来完成,不需要在执行时访问表。(这种情况比较少见)
    =》sql举例=《
EXPLAIN SELECT MIN(id) FROM film;

在这里插入图片描述
这个例子中,table列为null,表示在优化阶段分解查询语句,在执行阶段用不着再访问表或索引就能得到结果。

  • const, system:mysql能对查询的某部分进行优化并将其转化成一个常量(可以看show warnings 的结果)。用于
    primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是
    const的特例,表里只有一条元组匹配时为system。
    =》sql举例=《
EXPLAIN  SELECT * FROM (SELECT * FROM film WHERE id = 1) tmp;
SHOW WARNINGS;

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

/* select#1 */ SELECT '1' AS `id`,'电影1' AS `name` FROM DUAL
  • eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在
    const 之外最好的联接类型了,简单的 select 查询不会出现这种 type
    =》sql举例=《
EXPLAIN SELECT * FROM film_actor LEFT JOIN film ON film_actor.film_id = film.id

在这里插入图片描述

关联查询时,两张表的数据都要查询,所以id的值相同,按照第一行先执行然后第二行再执行的顺序。

  • ref:相比 eq_ref,不使用唯一索引,而是使用普通索引(二级索引)或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
    =》sql举例1=《
EXPLAIN SELECT * FROM film WHERE NAME = 'film1';

在这里插入图片描述
这个sql使用到了这张表的二级索引:idx_name
在这里插入图片描述
=》sql举例2=《
关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分。

EXPLAIN SELECT film_id FROM film LEFT JOIN film_actor ON film.id = film_actor.film_id

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

  • range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
    =》sql举例=《
EXPLAIN SELECT * FROM actor WHERE id > 1;

在这里插入图片描述

  • index:扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。

这里来讲讲覆盖索引:
假设我们有一张表user_info,有三列分别为id,name,sex。增加一个单值索引:KEY idx_name (name)

CREATE TABLE `user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `sex` varchar(2) DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表数据:
在这里插入图片描述

按照我们第一个博客中讲到的,此时主键索引和二级索引对应的B+树数据结构长这样。

主键索引:
在这里插入图片描述

二级索引:
在这里插入图片描述
sql语句:

EXPLAIN SELECT id,NAME FROM `user_info`

在这里插入图片描述
在有name这列的索引时:我们只查询name和id时。在二级索引的数据结构中我们可以看到叶子节点是完全满足我们查询的内容的,而且相比于主键索引,主键索引的叶子节点的数据更多(查询数据时需要把查询的叶子节点中的数据加载到内存,主键索引占用空间更多,二级数据少占用空间少。)。所以mysql选择去二级索引里去查询。二级索引涵盖了要查询的列内容。走二级索引查询就可满足条件的这种方式即覆盖索引。覆盖索引不是一个索引,而是一种方式。

  • ALL::即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。

5.possible_keys

这一列显示查询可能使用哪些索引来查找。
explain 时可能出现 possible_keys 列有内容,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引
对此查询帮助不大,选择了全表查询。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提
高查询性能,然后用 explain 查看效果。
请结合上边几个例子进行理解。

6.key

这一列显示mysql实际采用哪个索引来优化对该表的访问。
如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force
index、ignore index。
请结合上边几个例子进行理解。

7.key_len

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
=》sql举例=《

EXPLAIN SELECT * FROM film_actor WHERE film_id = 999;

在这里插入图片描述
通过key列我们知道这个查询使用到了idx_film_actor_id索引,这个索引是一个联合索引(film_id, actor_id)两个列。
在这里插入图片描述
都为int类型,一个int占4个字节,两个则为4+4=8个字节。
通过key_len列为4我们知道,它这个查询只用到了部分索引,也就是用到了film_id相关的索引,为什么是film_id而不是actor_id呢?这里结合上一博客的最左原理就不难知道,联合索引的优先级是先film_id在actor_id结合在一起排序的,如果要在联合索引中查询actor_id那么必须保证film_id是有顺序的,因为是actor_id是在film_id的基础上有序的。在我们不知道ken_len时通过最左原理也能推断出来,有了ken_len就更加方便了。

EXPLAIN SELECT * FROM film_actor WHERE film_id = 999 AND actor_id = 666;

在这里插入图片描述
这个例子就表示所有字段都用上了索引。

key_len计算规则如下:

  1. 字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节
    (1)char(n):如果存汉字长度就是 3n 字节
    (2)varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为varchar是变长字符串
    (3)varchar是变长字符串
  2. 数值类型
    (1)tinyint:1字节
    (2)smallint:2字节
    (3)int:4字节
    (4)bigint:8字节
  3. 时间类型
    (1)date:3字节
    (2)timestamp:4字节
    (3)datetime:8字节

如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。

8.ref

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(表名 . 列名)。

EXPLAIN SELECT film_id FROM film LEFT JOIN film_actor ON film.id = film_actor.film_id;

在这里插入图片描述

9.rows

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

10.Extra

这一列展示的是额外信息。常见的重要值如下:

  • Using index:使用覆盖索引。
EXPLAIN SELECT film_id FROM film_actor WHERE film_id = 1;

在这里插入图片描述

  • Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖。
EXPLAIN SELECT * FROM actor WHERE NAME = 'qqqq';

在这里插入图片描述

  • Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围。
EXPLAIN SELECT * FROM film_actor WHERE film_id > 1;

在这里插入图片描述

  • Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
EXPLAIN SELECT DISTINCT NAME FROM actor

在这里插入图片描述
给改变name增加一个索引就可以解决这个问题。
之前举过的例子,film表中的name是加过索引的。

EXPLAIN SELECT DISTINCT NAME FROM film

在这里插入图片描述

  • Using filesort:将用外部排序而不是索引排序,数据较小时在内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。(后续会详细讲解)
EXPLAIN SELECT * FROM actor ORDER BY NAME;

在这里插入图片描述

EXPLAIN SELECT * FROM film ORDER BY NAME;

在这里插入图片描述

  • Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时。

四、索引优化实战(遵循原则)

创建表

CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='员工记录表'
INSERT INTO employees(NAME,age,POSITION,hire_time) VALUES('LiHua',22,'manager',NOW());
INSERT INTO employees(NAME,age,POSITION,hire_time) VALUES('HanLei',23,'dev',NOW());
INSERT INTO employees(NAME,age,POSITION,hire_time) VALUES('Lucy',23,'dev',NOW());

1.全值匹配

条件中的字段要完全匹配

=》sql举例=《

EXPLAIN SELECT * FROM employees WHERE NAME= 'LiLei';

在这里插入图片描述
这个key_len是怎么来的:name是varchar(24)。通过上边的公式,3n+2计算:3*24+2=74

EXPLAIN SELECT * FROM employees WHERE LEFT(NAME,3)= 'LiLei';

在这里插入图片描述
不了解left函数的,他接受两个参数,分别为Left(str,len),str为你要截取的字符串,len为从左开始截取几位。

SELECT LEFT('LiLei',3) AS 结果

在这里插入图片描述

2.最左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
之前内容也详细讲过了,这里只举例子。

EXPLAIN SELECT * FROM employees WHERE NAME = 'Bill' AND age = 31;

在这里插入图片描述

EXPLAIN SELECT * FROM employees WHERE age = 30 AND POSITION = 'dev';

在这里插入图片描述

EXPLAIN SELECT * FROM employees WHERE POSITION = 'manager';

在这里插入图片描述

3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

=》sql举例=《
添加索引

ALTER TABLE `employees` ADD INDEX `idx_hire_time` (`hire_time`) USING BTREE ;
EXPLAIN select * from employees where date(hire_time) ='2018‐09‐30';

在这里插入图片描述

DATE(日期)函数,只提取日期的年月日。

SELECT DATE('2018-09-30 :00:00:00') AS 日期

在这里插入图片描述
为什么改成年月日查询就不走索引呢?
原因:因为索引树里边保存的数据是年月日时分秒保存的,单独年月日是对应不上的,是没有办法完全匹配上的,导致无法走索引。
优化思路:

EXPLAIN SELECT * FROM employees WHERE hire_time >='2018-09-30 00:00:00' 
AND hire_time <='2018-09-30 23:59:59'

在这里插入图片描述

演示完毕,删除索引

ALTER TABLE `employees` DROP INDEX `idx_hire_time`

4.存储引擎不能使用索引中范围条件右边的列

=》sql举例=《

EXPLAIN SELECT * FROM employees WHERE NAME= 'LiLei' AND age = 22 AND POSITION ='manager';

在这里插入图片描述
通过ken_len可以看出都三个条件都走索引了。
=》sql举例=《

EXPLAIN SELECT * FROM employees WHERE NAME= 'LiLei' AND age > 22 AND POSITION ='manager';

在这里插入图片描述

通过key_len可以看出只用到了索引中name和age字段,position字段没有走索引。
为什么会是这样呢?
首先,在name确定的情况下,age相对于name是有序的,position是有序的。
但是,第二条件是age大于的情况,即在age不确定的情况下,position不一定是有序的。但是age相对于确定的name下肯定是有序的。索引age能走索引,但是position是不可以的。
也就是说,在name=‘LiLei’ AND age > 22 范围下,position不是连续出现的,即不是有序的。可能age=23下有一部分内容,age24下没有,然后age30下又有了。这总情况下需要在这个范围扫描一下数据,看那些符合POSITION =‘manager’。

5.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句

覆盖索引上边已经讲过了,为什么不推荐使用select * ,是因为你要走覆盖索引,那索引中的叶子节点不是保存的所有列数据,可能就是某几列的索引,所以尽量查询贴近二级索引相关数据。
=》sql举例=《

EXPLAIN SELECT NAME,age FROM employees WHERE NAME= 'LiLei' AND age = 23 AND POSITION ='manager';

在这里插入图片描述

EXPLAIN SELECT * FROM employees WHERE NAME= 'LiLei' AND age = 23 AND POSITION ='manager';

在这里插入图片描述

6.mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描

< 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引

EXPLAIN SELECT * FROM employees WHERE NAME != 'LiHua';

在这里插入图片描述
通过key列可以看出没有走索引,为啥还有这种情况呢?
因为mysql走不走索引是有一套计算逻辑的,它可能认为你直接扫描全表可能比索引要快,一般情况表数据少的话,可能有种情况。

7.is null,is not null 一般情况下也无法使用索引

EXPLAIN SELECT * FROM employees WHERE NAME IS NULL

在这里插入图片描述

8.like以通配符开头(‘$abc…’)mysql索引失效会变成全表扫描操作

EXPLAIN SELECT * FROM employees WHERE NAME LIKE '%Li'

在这里插入图片描述

EXPLAIN SELECT * FROM employees WHERE NAME LIKE 'Li%'

在这里插入图片描述

结合B+树的结构,不难看出前百分号,即后缀包含Li的字符串,这个范围中不一定在B+树是有序的,没有办法走索引。
但是后百分号,前边Li是固定,那同样都是Li开头的数据,在B+树保存的肯定是有序的,所以是能走索引的。

那如果我就需要用到前百分号,怎么能优化一下呢?那就尽量让他走覆盖索引。

EXPLAIN SELECT NAME,age,POSITION FROM employees WHERE NAME LIKE '%Li'

在这里插入图片描述
把type为ALL变成了index。

like的后百分号匹配相当于常量查询查询。

like KK%相当于=常量,%KK和%KK% 相当于范围

9.字符串不加单引号索引失效

EXPLAIN SELECT * FROM employees WHERE NAME = '1000';

在这里插入图片描述

EXPLAIN SELECT * FROM employees WHERE NAME = 1000;

在这里插入图片描述

10.少用or或in

用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引,详见后续博客范围查询优化内容。

EXPLAIN SELECT * FROM employees WHERE NAME = 'LiHua' OR NAME = 'HanLei';

在这里插入图片描述

11.范围查询优化

添加一个索引

ALTER TABLE `employees` ADD INDEX `idx_age` (`age`) USING BTREE ;
EXPLAIN SELECT * FROM employees WHERE age >=1 AND age <=2000;

在这里插入图片描述

没走索引原因:mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。比如这个例子,可能是
由于单次数据量查询过大导致优化器最终选择不走索引
优化方法:可以将大的范围拆分成多个小范围。

EXPLAIN SELECT * FROM employees WHERE age >=1 AND age <=1000;

在这里插入图片描述

EXPLAIN SELECT * FROM employees WHERE age >=1001 AND age <=2000;

在这里插入图片描述
为什么第一条没走,但是第二条走了呢?
mysql其实自己有一套怎么查询的逻辑,会对每种方案进行一个评分,最终按照分数高的方案来执行,这种情况即选择全表扫描还是走索引查询。评分相关内容在后边博客中会讲到,这里先引出来一下这块逻辑。

最后,去掉索引。

ALTER TABLE `employees` DROP INDEX `idx_age`;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年7月京东奶粉行业品牌销售排行榜(京东数据产品)

鲸参谋监测的京东平台7月份奶粉市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年7月份&#xff0c;京东奶粉市场的销量为600万&#xff0c;同比去年同期有所下滑&#xff0c;整体下降约21%&#xff1b;销售额为22亿&#xff0c;同比增长约9%。由此也…

UWB学习——day2

UWB应用 基于上文UWB学习——day1中对UWB技术的相关优势介绍&#xff0c;UWB技术可广泛应用于以下场景。 WPAN&#xff08;无线个域网&#xff09; 基于其高精度&#xff08;亚厘米级&#xff09;、低功耗和高穿透性等特征&#xff0c;在以人为基础的个域网中应用广泛&#…

使用自动模型

本文通过文本分类任务演示了HuggingFace自动模型使用方法&#xff0c;既不需要手动计算loss&#xff0c;也不需要手动定义下游任务模型&#xff0c;通过阅读自动模型实现源码&#xff0c;提高NLP建模能力。 一.任务和数据集介绍 1.任务介绍 前面章节通过手动方式定义下游任务模…

2020年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

Mybatis传参parameterType为List<Map>

这里分别记录使用过的五种传参方式&#xff1a; 1、在入参只有一个的情况下,Mapper.java中直接传即可 2、而在参数有两三个的情况下,Mapper.java中可以用Param注解来指定入参 程序就知道哪个参对应拼接完SQL的哪个条件字段 并且Mapper.xml中parameterType不用去指定&#xff…

controller接口上带@PreAuthorize的注解如何访问 (postman请求示例)

1. 访问接口 /*** 查询时段列表*/RateLimiter(time 10,count 10)ApiOperation("查询时段列表")PreAuthorize("ss.hasPermi(ls/sy:time:list)")GetMapping("/list")public TableDataInfo list(LsTime lsTime){startPage();List<LsTime> l…

【 Tkinter界面-练习04】 画板作画详细揭示

一、说明 对画布的掌握分三个部分&#xff0c;将图形paint到画布、动画move、鼠标画&#xff1b;本篇将侧重于鼠标画的功能&#xff0c;提起鼠标画实现&#xff0c;将涉及一系列组合操作才能完成&#xff0c;这里将一一加以介绍。 Canvas 小部件具有大量功能&#xff0c;我们不…

这是公司最糟糕的程序员,但是我坚决要留住他!

我在一家著名的软件咨询公司工作&#xff0c;有一天&#xff0c;公司决定对开发人员的个人绩效进行度量。 这个目标很美好&#xff1a;评估个人能力&#xff0c;帮助开发人员成长。 指标经过层层分解&#xff0c;来到我们团队&#xff0c;经过经理的认真讨论&#xff0c;决定不…

云备份客户端——数据管理模块

数据管理模块设计之前&#xff0c;我们需要先明确该模块的信息是用来做什么的。根据上文分析该模块信息主要用于判断一个文件是否需要备份&#xff0c;判断条件有两个&#xff1a;1.新增文件 2.被修改过的文件 新增文件好判断&#xff0c;由于我们获得新文件后是先上传文件&…

有效利用云测试的关键要素是什么

云测试是一种基于云计算平台的软件测试方法&#xff0c;它将测试环境和资源部署在云端&#xff0c;通过网络连接来执行测试任务。云测试提供了弹性的计算能力和资源管理&#xff0c;可以根据需求快速扩展和缩减测试环境&#xff0c;使测试过程更加灵活和高效。那么&#xff0c;…

如何在国内安装Bitdefender

我一直有关注国外的antivirus的情况&#xff0c;之前一直用ESET&#xff0c;但是最近一直关注到 Bitdefender 可以和卡巴斯基旗鼓相当&#xff0c;于是抱着试试看的精神&#xff0c;在win10和win11安装了一遍。外国软件大都服务部署在AWS&#xff0c;但是我们这儿的运营商和某种…

使用极域电子教室控制学员机开机问题

遇到问题&#xff1a; 昨天晚上试了一下从网上下载的“极域电子教室”软件&#xff0c;首先保证教师机和学员机器在同一局域网下&#xff0c;然后我发现&#xff1a;教师机可以控制学员机 关机、重启&#xff0c;但是不能控制学员机 开机。 解决办法&#xff1a; 按下电脑开机…

磁盘分析 wiztree[win32] baobab[linux]

磁盘分析 wiztree[win32] && baobab[linux] wiztree[win32]baobab 又叫 Disk Usage Analyzer[linux]安装使用 参考 wiztree[win32] baobab 又叫 Disk Usage Analyzer[linux] baobab 又叫 Disk Usage Analyzer&#xff0c;是 Ubuntu 系统默认自带的磁盘分析工具&#x…

原生js之dom添加表单验证

第一种,在form表单中加入onsubmit事件,进入事件后,可以通过dom.forms[父formname][子formname].value,然后测试这个别名是否为空,在这个判断语句中即可放入想要的表单验证 第二种,在input中加入required,这个是浏览器默认的校验,如果说input中加入required,则默认它生效. <…

【Arduino27】DHT11温湿度传感器模拟值实验

硬件准备 DHT11温湿度&#xff1a;1个 面包板&#xff1a;1个 杜邦线&#xff1a;3根 硬件连线 VDD引脚接 5V 电源 DATE引脚接 4号 接口 GND引脚接 GND 接口 软件程序 #include<DHT.h>#define DHT11_pin 4 //温湿度传感器引脚DHT dht(DHT11_pin,DHT11);float tem…

GO语言实战之接口实现与方法集

写在前面 嗯&#xff0c;学习GO&#xff0c;所以有了这篇文章博文内容为《GO语言实战》读书笔记之一主要涉及知识 接口是什么方法集(值接收和指针接收)多态 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&#xff0c;心里寂寞而凄凉&#xff0c;感到自己的…

FastDFS介绍

文章目录 一、什么是FastDFS二、FastDFS的架构2.1 跟踪服务器&#xff08;tracker server&#xff09;2.2 存储服务器&#xff08;storage server&#xff09;2.3 客户端&#xff08;client&#xff09; 三、 FastDFS功能逻辑分析3.1 upload file&#xff08;上传文件&#xff…

shell入门运算符操作、条件判断

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

分类算法系列⑤:决策树

目录 1、认识决策树 2、决策树的概念 3、决策树分类原理 基本原理 数学公式 4、信息熵的作用 5、决策树的划分依据之一&#xff1a;信息增益 5.1、定义与公式 5.2、⭐手动计算案例 5.3、log值逼近 6、决策树的三种算法实现 7、API 8、⭐两个代码案例 8.1、决策树…

springboot使用切面记录接口访问日志

前言 当我们开发和维护一个复杂的应用程序时&#xff0c;了解应用程序的运行情况变得至关重要。特别是在生产环境中&#xff0c;我们需要追踪应用程序的各个方面&#xff0c;以确保它正常运行并能够及时发现潜在的问题。其中之一关键的方面是记录应用程序的接口访问日志。 Sp…