mysql explain output_MySQL查询优化之explain的深入解析【转载】

在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作。

一、MySQL 查询优化器是如何工作的MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。最终目标是提交 SELECT 语句查找数据行,而不是排除数据行。优化器试图排除数据行的原因在于它排除数据行的速度越快,那么找到与条件匹配的数据行也就越快。如果能够首先进行最严格的测试,查询就可以执行地更快。

EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列:

说明

id

MySQL Query Optimizer 选定的执行计划中查询的序列号。表示查询中执行 select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。

select_type 查询类型

说明

SIMPLE

简单的 select 查询,不使用 union 及子查询

PRIMARY

最外层的 select 查询

UNION

UNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集

DEPENDENT UNION

UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集

SUBQUERY

子查询中的第一个 select 查询,不依赖于外 部查询的结果集

DEPENDENT SUBQUERY

子查询中的第一个 select 查询,依赖于外部 查询的结果集

DERIVED

用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里。

UNCACHEABLE SUBQUERY

结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估。

UNCACHEABLE UNION

UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询

说明

table

输出行所引用的表

type 重要的项,显示连接使用的类型,按最 优到最差的类型排序

说明

system

表仅有一行(=系统表)。这是 const 连接类型的一个特例。

const

const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System。

eq_ref

One row is read from this table for each combination of rows from the previous tables. Other than thesystemandconsttypes,this is the best possible join type. It is used when all parts of an index are used by the join and the index is aPRIMARY KEYorUNIQUE NOT NULLindex.

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column_part1=other_table.column

AND ref_table.key_column_part2=1;

ref

All rows with matching index values are read from this table for each combination of rows from the previous tables. ref is used if the join uses only a leftmost prefix of the key or if the key is not a PRIMARY KEY or UNIQUE index (in other words, if the join cannot select a single row based on the key value). If the key that is used matches only a few rows, this is a good join type.

ref can be used for indexed columns that are compared using the = or <=> operator. In the following examples, MySQL can use a ref join to process ref_table:

SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column_part1=other_table.column

AND ref_table.key_column_part2=1;

ref_or_null

This join type is likeref, but with the addition that MySQL does an extra search for rows that containNULLvalues. This join type optimization is used most often in resolving subqueries. In the following examples, MySQL can use aref_or_nulljoin to processref_table:

SELECT * FROM ref_table

WHERE key_column=expr OR key_column IS NULL;

index_merge

说明索引合并优化被使用了。

unique_subquery

This type replaces ref for some IN subqueries of the following form:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

unique_subquery is just an index lookup function that replaces the subquery completely for better efficiency.

index_subquery

This join type is similar to unique_subquery. It replaces IN subqueries, but it works for nonunique indexes in subqueries of the following form:

value IN (SELECT key_column FROM single_table WHERE some_expr)

range

Only rows that are in a given range are retrieved, using an index to select the rows. The key column in the output row indicates which index is used. The key_len contains the longest key part that was used. The ref column is NULL for this type.

range can be used when a key column is compared to a constant using any of the =, <>, >, >=, , BETWEEN, or IN() operators:

SELECT * FROM tbl_name

WHERE key_column = 10;

SELECT * FROM tbl_name

WHERE key_column BETWEEN 10 and 20;

SELECT * FROM tbl_name

WHERE key_column IN (10,20,30);

SELECT * FROM tbl_name

WHERE key_part1 = 10 AND key_part2 IN (10,20,30);

index

The index join type is the same as ALL, except that the index tree is scanned. This occurs two ways:

If the index is a covering index for the queries and can be used to satisfy all data required from the table, only the index tree is scanned. In this case, the Extra column says Using index. An index-only scan usually is faster than ALL because the size of the index usually is smaller than the table data.

A full table scan is performed using reads from the index to look up data rows in index order. Uses index does not appear in the Extra column.

MySQL can use this join type when the query uses only columns that are part of a single index.

all

最坏的情况,从头到尾全表扫描。

说明

possible_keys

指出 MySQL 能在该表中使用哪些索引有助于 查询。如果为空,说明没有可用的索引。

说明

key

MySQL 实际从 possible_key 选择使用的索引。 如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情 况下,可以在 SELECT 语句中使用 USE INDEX (indexname)来强制使用一个索引或者用 IGNORE INDEX(indexname)来强制 MYSQL 忽略索引

说明

key_len

使用的索引的长度。在不损失精确性的情况 下,长度越短越好。

说明

ref

显示索引的哪一列被使用了

说明

rows

MYSQL 认为必须检查的用来返回请求数据的行数

说明

rows

MYSQL 认为必须检查的用来返回请求数据的行数

extra 中出现以下 2 项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化。

extra 项

说明

Using filesort

表示 MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。MySQL 中无法利用索引完成的排序操作称为“文件排序”

Using temporary

表示 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。

下面来举一个例子来说明下 explain 的用法。

先来一张表:

复制代码代码如下:

CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`author_id` int(10) unsigned NOT NULL,

`category_id` int(10) unsigned NOT NULL,

`views` int(10) unsigned NOT NULL,

`comments` int(10) unsigned NOT NULL,

`title` varbinary(255) NOT NULL,

`content` text NOT NULL,

PRIMARY KEY (`id`)

);

再插几条数据:

复制代码代码如下:

INSERT INTO `article`

(`author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES

(1, 1, 1, 1, '1', '1'),

(2, 2, 2, 2, '2', '2'),

(1, 1, 3, 3, '3', '3');

需求:查询 category_id 为 1 且 comments 大于 1 的情况下,views 最多的 article_id。先查查试试看:

复制代码代码如下:

EXPLAIN

SELECT author_id

FROM `article`

WHERE category_id = 1 AND comments > 1

ORDER BY views DESC

LIMIT 1\G

看看部分输出结果:

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: article

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 3

Extra: Using where; Using filesort

1 row in set (0.00 sec)

很显然,type 是 ALL,即最坏的情况。Extra 里还出现了 Using filesort,也是最坏的情况。优化是必须的。

嗯,那么最简单的解决方案就是加索引了。好,我们来试一试。查询的条件里即 where 之后共使用了 category_id,comments,views 三个字段。那么来一个联合索引是最简单的了。

复制代码代码如下:

ALTER TABLE `article` ADD INDEX x ( `category_id` , `comments`, `views` );

结果有了一定好转,但仍然很糟糕:

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: article

type: range

possible_keys: x

key: x

key_len: 8

ref: NULL

rows: 1

Extra: Using where; Using filesort

1 row in set (0.00 sec)

type 变成了 range,这是可以忍受的。但是 extra 里使用 Using filesort 仍是无法接受的。但是我们已经建立了索引,为啥没用呢?这是因为按照 BTree 索引的工作原理,先排序 category_id,如果遇到相同的 category_id 则再排序 comments,如果遇到相同的 comments 则再排序 views。当 comments 字段在联合索引里处于中间位置时,因comments > 1 条件是一个范围值(所谓 range),MySQL 无法利用索引再对后面的 views 部分进行检索,即 range 类型查询字段后面的索引无效。那么我们需要抛弃 comments,删除旧索引:

复制代码代码如下:

DROP INDEX x ON article;

然后建立新索引:

复制代码代码如下:

ALTER TABLE `article` ADD INDEX y ( `category_id` , `views` ) ;

接着再运行查询:

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: article

type: ref

possible_keys: y

key: y

key_len: 4

ref: const

rows: 1

Extra: Using where

1 row in set (0.00 sec)

可以看到,type 变为了 ref,Extra 中的 Using filesort 也消失了,结果非常理想。再来看一个多表查询的例子。首先定义 3个表 class 和 room。

复制代码代码如下:

CREATE TABLE IF NOT EXISTS `class` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`card` int(10) unsigned NOT NULL,

PRIMARY KEY (`id`)

);

CREATE TABLE IF NOT EXISTS `book` (

`bookid` int(10) unsigned NOT NULL AUTO_INCREMENT,

`card` int(10) unsigned NOT NULL,

PRIMARY KEY (`bookid`)

);

CREATE TABLE IF NOT EXISTS `phone` (

`phoneid` int(10) unsigned NOT NULL AUTO_INCREMENT,

`card` int(10) unsigned NOT NULL,

PRIMARY KEY (`phoneid`)

) engine = innodb;

然后再分别插入大量数据。插入数据的php脚本:

复制代码代码如下:

$link = mysql_connect("localhost","root","870516");

mysql_select_db("test",$link);

for($i=0;$i<10000;$i++)

{

$j   = rand(1,20);

$sql = " insert into class(card) values({$j})";

mysql_query($sql);

}

for($i=0;$i<10000;$i++)

{

$j   = rand(1,20);

$sql = " insert into book(card) values({$j})";

mysql_query($sql);

}

for($i=0;$i<10000;$i++)

{

$j   = rand(1,20);

$sql = " insert into phone(card) values({$j})";

mysql_query($sql);

}

mysql_query("COMMIT");

?>

然后来看一个左连接查询:

复制代码代码如下:

explain select * from class left join book on class.card = book.card\G

分析结果是:

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

2 rows in set (0.00 sec)

显然第二个 ALL 是需要我们进行优化的。建立个索引试试看:

复制代码代码如下:

ALTER TABLE `book` ADD INDEX y ( `card`);

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ref

possible_keys: y

key: y

key_len: 4

ref: test.class.card

rows: 1000

Extra:

2 rows in set (0.00 sec)

可以看到第二行的 type 变为了 ref,rows 也变成了 1741*18,优化比较明显。这是由左连接特性决定的。LEFT JOIN 条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要建立索引。删除旧索引:

复制代码代码如下:

DROP INDEX y ON book;

建立新索引。

复制代码代码如下:

ALTER TABLE `class` ADD INDEX x ( `card`);

结果

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

2 rows in set (0.00 sec)

基本无变化。然后来看一个右连接查询:

复制代码代码如下:

explain select * from class right join book on class.card = book.card;

分析结果是:

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ref

possible_keys: x

key: x

key_len: 4

ref: test.book.card

rows: 1000

Extra:

2 rows in set (0.00 sec)

优化较明显。这是因为 RIGHT JOIN 条件用于确定如何从左表搜索行,右边一定都有,所以左边是我们的关键点,一定需要建立索引。删除旧索引:

复制代码代码如下:

DROP INDEX x ON class;

建立新索引。

复制代码代码如下:

ALTER TABLE `book` ADD INDEX y ( `card`);

结果

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

2 rows in set (0.00 sec)

基本无变化。

最后来看看 inner join 的情况:

复制代码代码如下:

explain select * from class inner join book on class.card = book.card;

结果:

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ref

possible_keys: x

key: x

key_len: 4

ref: test.book.card

rows: 1000

Extra:

2 rows in set (0.00 sec)

删除旧索引:

复制代码代码如下:

DROP INDEX y ON book;

结果

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

2 rows in set (0.00 sec)

建立新索引。

复制代码代码如下:

ALTER TABLE `class` ADD INDEX x ( `card`);

结果

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

2 rows in set (0.00 sec)

综上所述,inner join 和 left join 差不多,都需要优化右表。而 right join 需要优化左表。

我们再来看看三表查询的例子

添加一个新索引:

复制代码代码如下:

ALTER TABLE `phone` ADD INDEX z ( `card`);

ALTER TABLE `book` ADD INDEX y ( `card`);

复制代码代码如下:

explain select * from class left join book on class.card=book.card left join phone on book.card = phone.card;

复制代码代码如下:

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: class

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 20000

Extra:

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: book

type: ref

possible_keys: y

key: y

key_len: 4

ref: test.class.card

rows: 1000

Extra:

*************************** 3. row ***************************

id: 1

select_type: SIMPLE

table: phone

type: ref

possible_keys: z

key: z

key_len: 4

ref: test.book.card

rows: 260

Extra: Using index

3 rows in set (0.00 sec)

后 2 行的 type 都是 ref 且总 rows 优化很好,效果不错。MySql 中的 explain 语法可以帮助我们改写查询,优化表的结构和索引的设置,从而最大地提高查询效率。当然,在大规模数据量时,索引的建立和维护的代价也是很高的,往往需要较长的时间和较大的空间,如果在不同的列组合上建立索引,空间的开销会更大。因此索引最好设置在需要经常查询的字段中。

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

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

相关文章

char强制类型转换为int_C语言学习第5篇---类型转换概念理解

类型之间的转换1.C语言中的数据可以进行转换---强制类型转换---隐式类型转换强制类型转换1.强制类型转换的语法---&#xff08;Type&#xff09;var_name;---&#xff08;Type&#xff09;value;2.强制类型转换的结果---目标类型能够容纳目标值&#xff0c;结果不变---目标类型…

python 中求最大值问题_Python中用max()方法求最大值的介绍

max() 方法返回其参数最大值&#xff1a;最接近正无穷大的值。语法以下是max()方法的语法&#xff1a; max( x, y, z, .... )参数 x -- 这是一个数值表达式。 y -- 这也是一个数值表达式。 z -- 这是一个数值表达式。返回值此方法返回其参数的最大值。例子下面的例子显示了max(…

在项目中使用fastreport_如何在项目管理中使用里程碑

不管您的项目是什么&#xff0c;完成大工作都意味着朝目标端点迈出几步。正如您无法结束旅程一样&#xff0c;您的团队必须完成第一步&#xff0c;以便从下一个步骤开始并最终完成项目。这可能是设定里程碑的最大原因。毕竟&#xff0c;如果没有完成日期&#xff0c;则项目的一…

java nio的演进_Java接口的防御性API演进

java nio的演进API的发展绝对是不平凡的。 只有少数几个需要处理的事情。 我们大多数人每天都在使用内部专有API。 现代IDE附带了很棒的工具&#xff0c;可以分解&#xff0c;重命名&#xff0c;上拉&#xff0c;下推&#xff0c;间接&#xff0c;委托&#xff0c;推断&#xf…

python层次聚类法画图_Python实现简单层次聚类算法以及可视化

本文实例为大家分享了Python实现简单层次聚类算法&#xff0c;以及可视化&#xff0c;供大家参考&#xff0c;具体内容如下基本的算法思路就是&#xff1a;把当前组间距离最小的两组合并成一组。算法的差异在算法如何确定组件的距离&#xff0c;一般有最大距离&#xff0c;最小…

range函数python2和3区别_【后端开发】range函数python2和3区别

range函数是一个用来创建算数级数序列的通用函数&#xff0c;返回一个[start, start step, start 2 * step, ...]结构的整数序列&#xff1b;py2中的range()函数用法&#xff1a;&#xff08;推荐学习&#xff1a;Python视频教程&#xff09; range()返回的是一个列表 >&g…

mysql AUTO_INC 是否锁_AUTO-INC锁的一些思考

AUTO-INC锁是一个表级锁&#xff0c;这种锁是作用于语句的而不是事务(即语句执行完了锁就会被释放)。innodb_autoinc_lock_mode用于控制AUTO-INC的锁表逻辑&#xff0c;可能的取值为0,1,2.innodb_autoinc_lock_mode0 (每次都会产生表锁)不管是对于simple inserts(insert into v…

Java 8可选

在编程时&#xff0c;我们都面临着最&#xff08; 臭名昭著 &#xff09;的NullPointerException 。 而且我相信我们所有人都同意&#xff0c;遇到NullPointerException也是一种痛苦。 为了使读者了解最新情况&#xff0c;著名的计算机科学家Tony Hoare引入了空引用&#xff0c…

matlab cat函数_如何用Matlab编写贪吃蛇游戏?(持续更新)

今后我们实验室的研究重点将会聚焦在“基于游戏的测评”和”教育游戏化“这两个主题上&#xff0c;因此很有必要研究实现“爆款”游戏的一些基本的技术方法。这篇文章将介绍如何借助Matlab GUI 面向对象编程技术实现贪吃蛇游戏。所有的游戏都可以解构成至少两个层次&#xff1…

python程序设计案例课堂第二篇_Python程序设计案例课堂第二篇核心技术第十章图形用户界面...

第10章 图形用户界面保存并运行程序&#xff0c;结果如图10-1所示。C:\Users\Administrator>python d:\python\ch10\10.1.py图10-1 程序运行结果【案例剖析】上述代码的含义分析如下。(1) 第1行&#xff1a;加载tkinter 模块。(2) 第 2 行&#xff1a;使用tkinter 模块的Tk(…

fprintf函数的用法matlab_极力推荐这个Matlab教程

点击蓝字 关注我们儿童节快乐前些日子, 由于一些原因的需要, 又把曾经的毕业论文拿来, 改吧改吧, 发现有些地方真的惨目忍睹, 只怪当时太年轻, 没想到给自己挖了一个大坑, 不,, 应该称之为巨坑, 对于论文中涉及到的代码, 当时主要使用了伪代码的形式, 以及现学现用的Python, 可…

websockets_使用Java WebSockets,JSR 356和JSON映射到POJO的

websockets因此&#xff0c;我一直在研究Tyrus &#xff08;JSR 356 WebSocket for Java规范的参考实现&#xff09;。 因为我一直在寻找测试工具&#xff0c;所以我对在Java中同时运行客户端和服务器端感兴趣。 因此&#xff0c;恐怕此博客文章中没有HTML5。 在此示例中&…

查看mysql主从复制是否成功的命令_mysql主从复制 - hong查理的个人空间 - OSCHINA - 中文开源技术交流社区...

1.配置 my.cof服务器A(192.168.1.2)配置如下log-bin mysql-binserver-id 1expire-logs-days 7#日志设置最高7天replicate-do-db test #需要同步的binlog-ignore-db mysql #忽略同步的binlog-ignore-db information_schema #忽略同步的auto-increment-increment 2…

python抓取数据时失败_爬取数据缺失的补坑,Python数据爬取的坑坑洼洼如何铲平...

渣渣业余选手讲解&#xff0c;关于爬取数据缺失的补坑&#xff0c;一点点关于Python数据爬取的坑坑洼洼如何铲平&#xff0c;个人的一些心得体会&#xff0c;还有结合实例的数据缺失的补全&#xff0c;几点参考&#xff0c;仅供观赏&#xff0c;如有雷同&#xff0c;那肯定是我…

关于总决赛

可以将变量声明为final。 最终变量只能分配一次。 如果分配了最终变量&#xff0c;则将导致编译时错误&#xff0c;除非在分配前立即将其绝对取消分配。 分配任何最终变量后&#xff0c;将永远无法对其进行更改。 如果变量引用任何对象的任何实例&#xff0c;它将继续引用相同的…

java中void_关于java中void的用法?

阿波罗的战车void除了说明该方法没有返回值外&#xff0c;还有什么作用呢&#xff1f;构造方法同样也是没有返回值的&#xff0c;那它和void方法有什么区别呢&#xff1f;构造方法与方法又有什么区别&#xff1f;用具象的实物来表现的话三者有何种关系呢&#xff1f;id 除了说明…

卷积神经网络mnist手写数字识别代码_搭建经典LeNet5 CNN卷积神经网络对Mnist手写数字数据识别实例与注释讲解,准确率达到97%...

LeNet-5卷积神经网络是最经典的卷积网络之一&#xff0c;这篇文章就在LeNet-5的基础上加入了一些tensorflow的有趣函数&#xff0c;对LeNet-5做了改动&#xff0c;也是对一些tf函数的实例化笔记吧。环境 Pycharm2019Python3.7.6tensorflow 2.0 话不多说&#xff0c;先放完整源码…

glassfish_多种监视和管理GlassFish 3的方法

glassfishGlassFish 3支持多种监视和管理方法。 在本文中&#xff0c;我将简要介绍GlassFish提供的管理&#xff0c;监视和管理方法。 GlassFish管理控制台 GlassFish基于Web的管理控制台GUI可能是GlassFish管理最著名的界面。 默认情况下&#xff0c;运行GlassFish后&#xf…

java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...

锁的实现锁的实现其实很简单&#xff0c;主要使用Java中synchronized关键字。public class Lock {private volatile boolean isLocked false;private Thread lockingThread null;public synchronized void lock() throws InterruptedExpection {while(isLocked){wait();}isLo…

flask-mail异步发送邮件_SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件

一、JavaMail的核心API1、API功能图解2、API说明(1)、Message 类:javax.mail.Message 类是创建和解析邮件的一个抽象类子类javax.mail.internet.MimeMessage &#xff1a;表示一份电子邮件。 发送邮件时&#xff0c;首先创建出封装了邮件数据的 Message 对象&#xff0c; 然后把…