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

目录

  • 一、了解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.mzph.cn/news/75181.shtml

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

相关文章

python关闭指定进程以excel为例

先说下环境&#xff1a; Excel版本&#xff1a; Python2.7.13和Python3.10.4并存。 2、打开两个excel工作簿 看进程是这样的&#xff1a; 3、用python编程kill进程 # -*- coding: utf-8 -*- import os proc_nameEXCEL.EXE if __name__ __main__:os.system(taskkill /im {} /…

【vue2第十六章】VueRouter 声明式导航(跳转传参)、路由重定向、页面未找到的提示页面404、vue路由模式设置

声明式导航(跳转传参) 在一些特定的需求中&#xff0c;跳转路径时我们是需要携带参数跳转的&#xff0c;比如有一个搜索框&#xff0c;点击搜索的按钮需要跳转到另外一个页面组件&#xff0c;此时需要把用户输入的input框的值也携带到那页面进行发送请求&#xff0c;请求数据。…

python 随机生成emoji表情

问答板块觉得比较有意思的问题 当时搜了些网上的发现基本都不能用&#xff0c;不知道是版本的问题还是咋的就开始自己研究 python随机生成emoji 问题的产生解决官网文档数据类型实现思路实现前提&#xff1a;具体实现&#xff1a; 其他常见用法插入 Emoji 表情&#xff1a;解析…

【ES6】Class中this指向

先上代码&#xff1a; 正常运行的代码&#xff1a; class Logger{printName(name kexuexiong){this.print(hello ${name});}print(text){console.log(text);} }const logger new Logger(); logger.printName("kexueixong xiong");输出&#xff1a; 单独调用函数p…

搭建自己的OCR服务,第二步:PaddleOCR环境安装

PaddleOCR环境安装&#xff0c;遇到了很多问题&#xff0c;根据系统不同问题也不同&#xff0c;不要盲目看别人的教程&#xff0c;有的教程也过时了&#xff0c;根据实际情况自己调整。 我这边目前是使用windows 10系统CPU python 3.7 搭建。 熟悉OCR的人应该知道&#xff0…

合宙Air724UG LuatOS-Air LVGL API控件-标签 (Label)

标签 (Label) 标签是 LVGL 用来显示文字的控件。 示例代码 label lvgl.label_create(lvgl.scr_act(), nil) lvgl.label_set_recolor(label, true) lvgl.label_set_text(label, "#0000ff Re-color# #ff00ff words# #ff0000 of\n# align the lines …

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

尚硅谷大数据项目《在线教育之离线数仓》笔记008

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 P123 P124 P125 P126 P127 P128 P129 P123 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数…

医院空调冷热源设计方案VR元宇宙模拟演练的独特之处

作为一个备受关注的技术-元宇宙&#xff0c;毋庸置疑的是&#xff0c;因为建筑本身契合了时尚、前卫、高端、虚拟、科幻、泛在、协作、互通等元素特征&#xff0c;因此在建筑行业更需要元宇宙&#xff0c;以居民建筑环境冷热源设计来说&#xff0c;元宇宙会打破既定的现实阻碍和…

LVS NAT模式负载均衡群集部署

目录 1 群集(集群) cluster 1.1 群集的类型 2 LVS的工作模式及其工作过程 2.1 NAT模式&#xff08;VS-NAT&#xff09; 2.2 直接路由模式&#xff08;VS-DR&#xff09; 2.3 IP隧道模式&#xff08;VS-TUN&#xff09; 3 LVS-NAt 模式配置步骤 3.1 部署共享存储 3.2 配…

SSL证书验签时要带www吗?

单域名证书&#xff1a;顶级域名如www.abc.com或abc.com 不管你提交订单的时候填写的域名是带www或不带www的域名&#xff0c;签发的证书均支持www和不带www的域名 单域名证书&#xff1a;子域名如mail.abc.com&#xff0c;签发的证书仅支持mail.abc.com 通配符证书&#xff…

MySQL触发器使用指南大全

一、介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&#xff0c;数据校验等操作。 使用别名OLD和NEW来引…

C++之生成key-value键值三种方式(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Web server failed to start. Port 8080 was already in use.之解决方法

问题&#xff1a; Web server failed to start. Port 8080 was already in use&#xff0c;这句错误描述意思是当前程序的端口号8080被占用了&#xff0c;需要将占用该端口的程序停止掉才行&#xff1b;错误如图所示&#xff1a; 解决方法&#xff1a; 按住winr&#xff0c;输入…

React 消息文本循环展示

需求 页面上有个小喇叭&#xff0c;循环展示消息内容 逻辑思路 设置定时器&#xff0c;修改translateX属性来实现滚动&#xff0c;判断滚动位置&#xff0c;修改list位置来实现无限滚动 实现效果 代码 /** Author: Do not edit* Date: 2023-09-07 11:11:45* LastEditors: …

android studio的Android Drawable Preview

Android Drawable Preview 应用后&#xff0c;如下图&#xff1a; 再也不用一个一个点开去看了 其他学习资料&#xff1a; 1、付费专栏《Android kotlin入门到进阶系列讲解》&#xff1a;https://blog.csdn.net/qq_35091074/category_11036895.html 2、免费专栏《Android kot…

【大虾送书第九期】速学Linux:系统应用从入门到精通

目录 &#x1f36d;写在前面 &#x1f36d;为什么学习Linux系统 &#x1f36d;Linux系统的应用领域 &#x1f36c;&#xff11;.Linux在服务器的应用 &#x1f36c;&#xff12;.嵌入式Linux的应用 &#x1f36c;&#xff13;.桌面Linux的应用 &#x1f36d;Linux的版本选择 &a…

使用PHPStudy在本地快速建立网站并实现局域网外访问(无公网IP)

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

无涯教程-JavaScript - IMPOWER函数

描述 IMPOWER函数以x yi或x yj文本格式返回加到幂的复数。求幂的复数的计算方法如下- $$(x yi)^ n r ^ ne ^ {n \theta} r ^ n \cos n \theta ir ^ n sin n \theta $$ 哪里- $$r \sqrt {x ^ 2 y ^ 2} \:\:和\:\:\theta \tan ^ {-1} \left(\frac {y} {x} \right)\:…

数字 IC 设计职位经典笔/面试题(四)

共100道经典笔试、面试题目&#xff08;文末可全领&#xff09; 画出 CMOS 电路的晶体管级电路图,实现 YA*BC(DE).&#xff1f; 画出 YABC 的 CMOS 电路图&#xff0c;画出 YABCD 的 CMOS 电路图。 利用与非门和或非门实现 YABC(DE)((AB’)(CD)’(CE)’)’ 三个两输入与非门&a…