MySQL数据库调优之 explain的学习

性能分析工具的使用

在数据库调优中,目标就是响应时间更快,吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮助快速找到调优的思路与方式。
1.数据库服务器的优化步骤
整个流程分为观察(Show status)行动(Action) 两个部分。字母S的部分代表观察,字母A代表的是行动。
在这里插入图片描述
如果发现执行SQL时存在不规则延迟或者卡顿的情况,就可以采用分析工具定位有问题的SQL。三种分析工具可以理解为SQL调优的三个步骤:慢查询、EXPLAIN和SHOW PFOFILING
在这里插入图片描述
2. 查看系统性能参数
在Mysql中,可以使用SHOW STATUS语句查询一些Mysql数据库服务器的性能参数、执行频率。

SHOW [GLOBAL |SESSION] STATUS LIKE ‘参数’;
在这里插入图片描述
查询连接次数
在这里插入图片描述
查询慢查询的次数
在这里插入图片描述
数据页
在这里插入图片描述
页的数量可能是刚才的20倍,但是查询的效率并没有明显的变化,实际上这两个SQL查询的时间基本上是一致的,就是因为采用了顺序读取的方式将页面一次性加载到缓冲池中,然后再进行查找。虽然页数量(last_query_cost)增加了不少,但是通过缓冲池的机制,并没有增加多少的查询时间。
使用场景: 对于比较开销是非常有用的,特别是当有好几种查询方式可以选择的时候。
SQL 查询是一个动态的过程,从页加载的角度来看,可以得出以下两个结论:
1.位置决定效率。如果页就在数据库缓冲池中,那么效率是很高的,否则还需要从内存或者磁盘中进行读取,当然针对单个页的读取来说,如果页存在于内存中,会比在磁盘中读取的效率高很多。
2.批量决定效率。如果我们从磁盘中对单一页进行随机读,那么效率是很低的,而采用顺序读取的方式,批量对页进行读取,平均一页的读取效率就会提升很多,甚至要快于单个页面在内存中的随机读。
所以说,遇到I/O并不用担心,方法找对了,效率还是很高的。首先要考虑数据存放的位置,如果是经常使用的数据就尽量放到缓冲池中,其次我们可以充分利用磁盘的吞吐能力,一次性批量读取数据,这样单个页的读取效率就会得到了提升。
定位执行慢的SQL:慢查询日志
Mysql的慢查询日志,用来记录Mysql中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询的日志中。long_query_time的默认值是10,意思是运行10秒以上(不含10秒)的语句,认为是超过了我们的最大忍耐时间值。
它的主要作用是,帮助我们发现哪些执行时间特别长的SQL查询,并且针对性的进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞,运行变慢的时候,检查一下慢查询日志,找到哪些慢查询,对解决问题很有帮助。比如1条SQL执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的SQL,结合explain进行全面的分析。
默认情况下,Mysql数据库没有开启慢查询日志,需要手动设置这个参数。如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少的带来一定的性能的影响。

在这里插入图片描述
SET GLOBAL slow_query_log=‘on’ 开启慢查询日志 ,改变一下时间 SET long_query_time=1
除了上述变量,控制慢查询日志的还有一个系统变量:‘min_examined_row_limit’。这个变量的意思是,查询扫描过的最少记录数。这个变量和查询执行时间,共同组成了判别一个查询是否是慢查询的条件。如果查询扫描过的记录数大于等于这个变量的值,并且查询执行时间超过long_query_time的值,那么,这个查询就被记录到慢查询的日志中;反之,则不被记录到慢查询的日志中。
在这里插入图片描述
这个值默认是0,与long_query_time=10 结合在一起,表示只要查询的执行时间超过10秒钟,哪怕一个记录也没有扫描过,都要被记录到慢查询的日志中。
慢查询日志的分析工具 :mysqldumpslow
在这里插入图片描述
关闭慢查询日志 set global slow_query_log=off

查看SQL 执行成本: SHOW PROFILE
show profile 是Mysql提供的可以用来分析当前会话中SQL都做了什么,执行的资源消耗情况的工具,可用于SQL调优的测量**。默认情况下处于关闭状态**,并保存最近15次的运行结果。
在这里插入图片描述
执行成本
在这里插入图片描述
针对于指定的某条查询 for query XX
在这里插入图片描述
show profile 的常用的查询参数
在这里插入图片描述

2. 分析查询语句:EXPLAIN

概述
定位了查询慢的SQL后,就可以使用explain或describe工具做针对性的分析查询语句。describe语句的使用方法与explain语句是一样的,并且分析结果也是一样的。
Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算饭呢西系统中收集到的统计信息,为客户端请求的Qurey 提供它认为最优的执行计划(它认为最优的数据检索方式,但不见得是DBA认为是最优的,这部分最消耗时间)。
这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么?对于每个表采用什么方法来具体执行查询等。mysql 提供了EXPLAIN 语句可以查看某个查询语句的具体执行计划。
能做些什么?
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询

 其实除了以SELECT开头的查询语句,其余的DELETE、INSERT、REPLACE以及UPDATE 语句等都可以加上EXPLAIN,用来查看这些语句的执行计划。

注意:执行EXPLAIN 时并没有真正的执行后面的语句,因此可以安全的查看执行计划
EXPLAIN 语句输出的各个列的作用
在这里插入图片描述
数据脚本准备

# 两张表
CREATE TABLE s1(id INT AUTO_INCREMENT,key1 VARCHAR(100),key2 INT,key3 VARCHAR(100),key_part1 VARCHAR(100),key_part2 VARCHAR(100),key_part3 VARCHAR(100),common_field VARCHAR(100),PRIMARY KEY(id),INDEX idx_key1(key1),UNIQUE INDEX idx_key2 (key2),INDEX idx_key3(key3),INDEX idx_key_part(key_part1,key_part2,key_part3)) ENGINE=INNODB  CHARSET=utf8;# 两张表  CREATE TABLE s2(id INT AUTO_INCREMENT,key1 VARCHAR(100),key2 INT,key3 VARCHAR(100),key_part1 VARCHAR(100),key_part2 VARCHAR(100),key_part3 VARCHAR(100),common_field VARCHAR(100),PRIMARY KEY(id),INDEX idx_key1(key1),UNIQUE INDEX idx_key2 (key2),INDEX idx_key3(key3),INDEX idx_key_part(key_part1,key_part2,key_part3)) ENGINE=INNODB  CHARSET=utf8;#函数
#创建随机产生字符串的函数DELIMITER //	
CREATE FUNCTION rand_string(n INT)RETURNS VARCHAR(255) #该函数返回一个字符串
BEGINDECLARE chars_str VARCHAR(100) DEFAULT 'adafqfabfabcafqifqfyhafnkfavbabvavhabdadhabcacakcacavhafqoqnacncabcbabaadaa';DECLARE return_str VARCHAR(255) DEFAULT '';		DECLARE i INT DEFAULT 0;WHILE i < n DOSET return_str=CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));SET i=i+1;
END WHILE;
RETURN return_str;
END //
DELIMITER;       SELECT @@log_bin_trust_function_creatorsSET  GLOBAL log_bin_trust_function_creators=1#创建随机产生数字的函数
DELIMITER //
CREATE FUNCTION rand_num(from_num INT,to_num INT) RETURNS INT(11)
BEGIN
DECLARE i INT DEFAULT 0;
SET i=FLOOR(from_num+RAND()*(to_num-from_num+1));
RETURN i;
END //
DELIMITER;#创建存储过程DELIMITER //CREATE PROCEDURE insert_s1(IN min_num INT(10),IN max_num INT(10))BEGINDECLARE i INT DEFAULT 0;SET autocommit=0;REPEATSET i=i+1;INSERT INTO s1 VALUES((min_num+i),rand_string(6),(min_num+30*i+5),rand_string(6),rand_string(10),rand_string(5),rand_string(10),rand_string(10));UNTIL i=max_numEND REPEAT;COMMIT;
END //
DELIMITER ;DELIMITER //CREATE PROCEDURE insert_s2(IN min_num INT(10),IN max_num INT(10))BEGINDECLARE i INT DEFAULT 0;SET autocommit=0;REPEATSET i=i+1;INSERT INTO s2 VALUES((min_num+i),rand_string(6),(min_num+30*i+5),rand_string(6),rand_string(10),rand_string(5),rand_string(10),rand_string(10));UNTIL i=max_numEND REPEAT;COMMIT;
END //
DELIMITER ;#调用存储过程CALL insert_s1(10001,10000);CALL insert_s2(10001,10000);

EXPLAIN 各列的作用
1.table
不论我们的查询语句有多复杂,里边包含了多少个表,到最后也是需要对每个表进行单表访问的,所以Mysql规定EXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该表的表名(有时不是真实的表名,可能是简称)
在这里插入图片描述
这个查询语句只涉及到对于s1的单表查询,所以EXPLAIN 输出中只有一条记录,其中的table列的值为s1.用来说明着条记录是对s1表的单表访问方法的。
shang在这里插入图片描述
多表关联查询,上面的驱动表,下面的是被驱动表
2.id
在一个大的查询语句中每个SELECT 关键字都对应一个唯一的id
在这里插入图片描述
查询优化器可能对涉及子查询的查询语句进行重写
在这里插入图片描述

id都为1,mysql查询优化器会把嵌套子查询转变为多表查询的操作

union去重
在这里插入图片描述
不需要去重的union all

在这里插入图片描述
id小结:
id 如果相同,可以认为是一组,从上往下的顺序执行
在所有的组中,id值越大,优先级越高,越先执行(子查询)
关注点:id号每个号码,表示一趟独立的查询,一个sql的查询趟数越少越好

3.select_type
一个大的查询语句里面可以包含若干个SELECT关键字,每个SELECT关键字代表着一个小的查询语句,而每个SELECT关键字的FROM子句都可以包含若干张表(这些表用来做连接查询),每一张表都对应着执行计划输出中的一条记录,对于在同一个SELECT关键字中的表来说,他们的id是相同的。
mysql为每一个SELECT关键字代表的小查询都定义了一称为select_type的属性,只要知道了某个小查询的select_type属性,就知道了这个小查询在整个大查询中扮演了一个什么角色
查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型
连接查询也算是SIMPLE类型
对于包含UNION或者UNION ALL 或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的查询的select_type值就是PRIMARY
对于包含UNION或者UNION ALL 的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询外,其余的小查询的SELECT_TYPE值就是UNION
子查询: 如果包含子查询的查询语句不能够转化为对应的semi-join的形式,并且该子查询是不相关子查询。该子查询的第一个SELECT关键字代表的那个查询的select_type 就是SUBQUERY。
在这里插入图片描述
如果包含子查询的查询语句不能够转化为对应的semi-join的形式,并且该子查询是不相关子查询。 则该子查询的第一个SELECT关键字代表的那个查询的SELECT_TYPE 就是
DEPENDENT
SUBQUERY
在这里插入图片描述
注意的是,select_type为DEPENDENT SUBQUERY的查询可能会被执行多次

在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询外,其余的小查询的SELECT_TYPE 就是DEPENDENT SUBQUERY

EXPLAIN SELECT * FROM s1
WHERE key1 IN (SELECT key1 FROM s2 WHERE key1='a' UNION  SELECT key1 FROM s1 WHERE key1='b');

在这里插入图片描述
其中的in会被SQL优化器转化为exists语句
对于包含派生表的查询,该派生表对应的子查询的select_type 就是DERIVED

EXPLAIN SELECT *
FROM (SELECT key1,COUNT(*) AS c FROM s1 GROUP BY key1) AS derived_s1 WHERE c>1

在这里插入图片描述
当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的select_type 属性就是MATERIALIZED

EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key1 FROM s2);##子查询被转化为了物化表

在这里插入图片描述
4.partition(略):匹配的分区信息

5.type 针对单表的访问方法(重要)
执行计划的一条记录就代表着mysql对某个表的执行查询时的访问方法,又称为访问类型。其中的type 列就表明了这个访问方法是啥,是较为重要的一个指标·。比如,type列的值为ref,表明mysql 即将使用ref访问方法来执行对s1表的查询。
当表中只有一条记录,并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system
当根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const
在这里插入图片描述
在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是“eq_ref”

在这里插入图片描述
当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就是ref
在这里插入图片描述
当对普通二级索引进行等值匹配查询,该索引列的值也可以是“NULL”值时,那么对该表的访问方法就可能是ref_or_null

在这里插入图片描述
单表访问方法时在某些场景下可以使用Intersection\Union\Sort-Union这三种索引合并的方式来执行查询
在这里插入图片描述
unique_subquery 是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转化为EXISTS子查询,而且子查询可以使用到主键进行等值匹配比较的话,那么该子查询执行计划的type列的值就是unique_subquery

EXPLAIN SELECT * FROM s1
WHERE key2 IN(SELECT id FROM s2 WHERE s1.key1=s2.key1) OR key3='a'

在这里插入图片描述
如果使用索引获取某些“范围区间”的记录,那么就可能使用到range访问方法

在这里插入图片描述
当可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index
在这里插入图片描述
最熟悉的全表扫描
在这里插入图片描述
在这里插入图片描述
6.possbile_key 和 key 重要
在explain语句的输出执行计划中,possible_keys列表示在某个查询语句中,对某个表执行单表查询时可能用到的索引有哪些。一般查询涉及到的字段上若存在索引,则该索引被列出,但不一定被查询使用。key 列表表示实际用到的索引有哪些,如果为NULL,则没有使用索引。 在这里插入图片描述
key1是个范围,key3是个精确值 把and改成or就是一个并集,属于一个范围,索引就会使用了
EXPLAIN SELECT * FROM s1 WHERE key1>‘z’ OR key3 =‘a’;
在这里插入图片描述
7.key_len 实际使用到的索引长度 值越大越好
帮你检查是否充分利用上了索引,值越大越好,主要针对于联合索引,有一定的意义
在这里插入图片描述
在这里插入图片描述

8.ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
比如只是一个常数或者是某个列
在这里插入图片描述
加一个函数upper后
在这里插入图片描述
9 rows 预估的需要读取的记录总数 值越小越好
在这里插入图片描述
10.filtered: 某个表经过搜索条件过滤后剩余记录条数的百分比
如果使用的是索引执行的单表扫描,那么计算时需要估计出满足除使用到对应索引的搜索条件外的其他搜索条件的记录有多少条 rowsfiltered的百分比的数据条数
EXPLAIN SELECT * FROM s1 WHERE key1 >‘a’ AND common_field=‘a’;
在这里插入图片描述
对于单表查询来说,这个filtered列的值没什么意义。**更需要关注在连接查询中驱动表对应的执行计划的filtered的值,它决定了被驱动表要执行的次数(即:rows
filtered)**
EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.key1=s2.key1 WHERE s1.common_field=‘a’;

在这里插入图片描述
11 Extra 比较重要 一些额外的信息
更准确的理解Mysql到底将如何执行给定的查询语句
当查询语句没有from 子句时将会提示该额外信息
在这里插入图片描述
查询语句的where子句的条件永远为fasle
在这里插入图片描述
使用全表扫描来执行对某个表的查询,并且该语句的where子句有针对该表的搜索条件时,在extra列中会提示额外信息
在这里插入图片描述
在使用索引访问来执行对某个表的查询,并且该语句的where子句中有除了该索引包含的列之外的其他搜索条件时,在extra列中也会提示额外的信息
EXPLAIN SELECT * FROM s1 WHERE key1=‘a’
在这里插入图片描述
EXPLAIN SELECT * FROM s1 WHERE key1=‘a’ AND common_field=‘a’

在这里插入图片描述
当查询列表处有MIN或MAX的聚合函数的时候,但是并没有符合WHERE子句中的搜索条件的记录时,将会提示额外信息
EXPLAIN SELECT MIN(key1) FROM s1 WHERE key1=‘adadaf’;
在这里插入图片描述
当查询列表以及搜索条件中包含属于某个索引的列,也就是在可以使用覆盖索引的情况下,在Extra列将会提示额外的信息。比如下边的查询中只需要使用到idx_key1而不需要回表的操作
EXPLAIN SELECT key1 FROM s1 WHERE key1=‘a’
在这里插入图片描述
有些搜索条件中虽然出现了索引列,但却不能使用到索引(索引下推)
EXPLAIN SELECT * FROM s1 WHERE key1 >‘z’ AND key1 LIKE ‘%a’;
在这里插入图片描述
在连接查询执行过程中,当被驱动表不能有效的利用索引来加快访问速度,mysql一般会为其分配一块叫join buffer的内存块来加快查询速度,也就是基于块的嵌套循环算法
EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.common_field=s2.common_field

在这里插入图片描述
当使用左外连接时,如果where子句中包含要求被驱动表的某个列等于NULL值的搜索条件,而且那个列又是不允许存储NULL值的,那么在该表的执行计划的Extra列就会提示Not Exists的额外信息
EXPLAIN SELECT * FROM s1 LEFT JOIN s2 ON s1.key1=s2.key1 WHERE s2.id IS NULL
在这里插入图片描述
在这里插入图片描述
EXPLAIN SELECT * FROM s1 WHERE key1=‘a’ OR key3=‘a’
在这里插入图片描述在这里插入图片描述
EXPLAIN SELECT * FROM s1 LIMIT 0

在这里插入图片描述
有一些情况下对结果集中的记录进行排序是可以使用到索引的
EXPLAIN SELECT * FROM s1 ORDER BY key1 LIMIT 10;
在这里插入图片描述
文件排序 filesort在这里插入图片描述
EXPLAIN SELECT * FROM s1 ORDER BY common_field LIMIT 10;

在这里插入图片描述
在许多查询的执行过程中,Mysql可能会借助临时表来完成一些功能。比如去重、排序一类的。比如在执行许多包含DISTINCT、GROUP BY、UNION等子句的查询过程中,**如果不能有效利用索引来完成查询,Mysql有可能寻求通过建立内部的临时表来执行查询。**如果查询中使用到了内部的临时表,在执行计划的extra列会显示Using temporary的提示
在这里插入图片描述
本身是有序的状态在这里插入图片描述
在这里插入图片描述
小结
Explain 不考虑各种Cache
explain 不能显示Mysql在执行查询过程时所作的优化操作
explain 不会告诉你关于触发器、存储过程的信息或者用户自定义函数对查询的影响情况
部分统计信息是估算的,并非精确值

在这里插入图片描述

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

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

相关文章

电路设计(28)——交通灯控制器的multisim仿真

1.功能设定 南北、东西两道的红灯时间、绿灯时间均为24S&#xff0c;数码管显示倒计时。在绿灯的最后5S内&#xff0c;黄灯闪烁。有夜间模式&#xff1a;按下按键进入夜间模式。在夜间模式下&#xff0c;数码管显示计数最大值&#xff0c;两个方向的黄灯不停闪烁。 2.电路设计 …

力扣645. 错误的集合(排序,哈希表)

Problem: 645. 错误的集合 文章目录 题目描述思路复杂度Code 题目描述 思路 1.排序 1.对nums数组按从小到大的顺序排序; 2.遍历数组时若判断两个相邻的元素则找到重复元素&#xff1b; 3.记录一个整形变量prev一次置换当前位置元素并与其作差&#xff0c;若差等于2着说明缺失的…

DNS域名解析过程

DNS是什么 维护一个用来表示组织内部主机名和IP地址之间对应关系的数据库。用户输入域名&#xff0c;DNS自动检索该数据库&#xff0c;并将其转换为IP地址。用的是UDP传输协议 DNS域名解析过程 域名的构成 首先要知道域名的层级&#xff0c;比如www.qq.com一般是主站&#…

备战蓝桥杯————双指针技巧巧解数组2

利用双指针技巧来解决七道与数组相关的题目。 两数之和 II - 输入有序数组&#xff1a; 给定一个按升序排列的数组&#xff0c;找到两个数使它们的和等于目标值。可以使用双指针技巧&#xff0c;在数组两端设置左右指针&#xff0c;根据两数之和与目标值的大小关系移动指针。 …

Ubuntu20.04开启/禁用ipv6

文章目录 Ubuntu20.04开启/禁用ipv61.ipv62. 开启ipv6step1. 编辑sysctl.confstep2. 编辑网络接口配置文件 3. 禁用ipv6&#xff08;sysctl&#xff09;4. 禁用ipv6&#xff08;grub&#xff09;附&#xff1a;总结linux网络配置 Ubuntu20.04开启/禁用ipv6 1.ipv6 IP 是互联网…

软考-中级-系统集成2023年综合知识(三)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 软考中级专栏回顾 专栏…

【ArcGIS】利用高程进行坡度分析:区域面/河道坡度

在ArcGIS中利用高程进行坡度分析 坡度ArcGIS实操案例1&#xff1a;流域面上坡度计算案例2&#xff1a;河道坡度计算2.1 案例数据2.2 操作步骤 参考 坡度 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。 坡度的表示方法有百分比法、度数…

基于springboot+vue的靓车汽车销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Python实战: 获取 后缀名(扩展名) 或 文件名

Python实战: 获取 后缀名(扩展名) 或 文件名 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &…

DAY29--learning English

一、积累 1.sign up for 2.business trip 3.calendar 4.acne 5.band-aid 6.scar 7.prescription 8.pimple 9.saucy 10.slurp 11.germaphobe 12.shred 13.boggle 14.platser 15.lick 16.sling 17.smack 18.stereotype 19.salmon 20.cable 二、练习 1.牛津原译 calendar. /ˈk…

9、使用 ChatGPT 的 GPT 制作自己的 GPT!

使用 ChatGPT 的 GPT 制作自己的 GPT! 想用自己的 GPT 超越 GPT ChatGPT 吗?那么让我们 GPT GPT 吧! 山姆 奥特曼利用这个机会在推特上宣传 GPTs 的同时还猛烈抨击了埃隆的格罗克。 GPTs概览 他们来了! 在上周刚刚宣布之后,OpenAI 现在推出了其雄心勃勃的新 ChatGPT…

【Django开发】0到1开发美多shop项目:Celery短信和用户注册。全md文档笔记(附代码,已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

day41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

本章知识点&#xff1a; 1 、 XML&XXE- 原理 & 发现 & 利用 & 修复等 2 、 XML&XXE- 黑盒模式下的发现与利用 3 、 XML&XXE- 白盒模式下的审计与利用 4 、 XML&XXE- 无回显 & 伪协议 & 产生层面 配套资源&#xff08;百度网盘&#x…

Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)

上篇文章介绍了深度Depth&#xff0c;这篇文章介绍下IP2P&#xff08;InstructP2P&#xff09;, 通俗理解就是图生图&#xff0c;给原有图加一些效果,比如下图&#xff0c;左边为原图&#xff0c;右边为增加了效果的图&#xff1a; 文章目录 一、选大模型二、写提示词三、基础参…

Flink ML 的新特性解析与应用

摘要&#xff1a;本文整理自阿里巴巴算法专家赵伟波&#xff0c;在 Flink Forward Asia 2023 AI特征工程专场的分享。本篇内容主要分为以下四部分&#xff1a; Flink ML 概况在线学习的设计与应用在线推理的设计与应用特征工程算法与应用 一、Flink ML 概况 Flink ML 是 Apache…

(六)激光线扫描-三维重建

本篇文章是《激光线扫描-三维重建》系列的最后一篇。 1. 基础理论 1.1 光平面 在之前光平面标定的文章中,已经提到过了,是指 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面。 三维空间中平面的公式是: A X + B Y + C Z + D = 0 A X+B Y+C Z+D=0

创建一个基于Node.js的实时聊天应用

在当今数字化社会&#xff0c;实时通讯已成为人们生活中不可或缺的一部分。无论是在社交媒体平台上与朋友交流&#xff0c;还是在工作场合中与同事协作&#xff0c;实时聊天应用都扮演着重要角色。与此同时&#xff0c;Node.js作为一种流行的后端技术&#xff0c;为开发者提供了…

【C++】C++入门篇,初识C++----第一个C++结构,C++关键字,命名空间,C++的输入输出,缺省参数【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C】C入门篇&#xff0c;初识C----第一个C结构&#xff0c;命名空间&#xff0c;C的输入输出&#xff0c;缺省参数【图文详解】&#xff0c;深刻理解命名空间&#xff0c;带大家入门C&#xff0c;感谢观看&#xff0c;支持的可以给个一…

华为配置WDS手拉手业务示例

配置WDS手拉手业务示例 组网图形 图1 配置WDS手拉手业务示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。但企业考虑到AP通过有线部署的成本较高&#xff0c;所以通过建立…

SpringBoot源码解读与原理分析(三十)AOP模块的生命周期(三)代理对象的底层执行逻辑

文章目录 前言9.6 代理对象的底层执行逻辑9.6.1 DemoService#test9.6.2 获取增强器链9.6.2.1 前置准备9.6.2.2 匹配增强器9.6.2.3 匹配后的处理9.6.2.4 其他增强器的处理 9.6.3 执行增强器9.6.3.1 执行proceed方法9.6.3.2 下标值9.6.3.3 执行第一个增强器9.6.3.4 再次执行proce…