mysql数值比中文检索快_MySQL 千万 级数据量根据(索引)优化 查询 速度

一、索引的作用

索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让人难以忍受了。

提升查询速度的方向一是提升硬件(内存、cpu、硬盘),二是在软件上优化(加索引、优化sql;优化sql不在本文阐述范围之内)。

能在软件上解决的,就不在硬件上解决,毕竟硬件提升代码昂贵,性价比太低。代价小且行之有效的解决方法就是合理的加索引。

索引使用得当,能使查询速度提升上万倍,效果惊人。

二、MySQL索引类型:

mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。

唯一索引和全文索引用的很少,我们主要关注主键索引、普通索引和聚合索引。

1)主键索引:主键索引是加在主键上的索引,设置主键(primary key)的时候,mysql会自动创建主键索引;

2)普通索引:创建在非主键列上的索引;

3)聚合索引:创建在多列上的索引。

三、索引的语法:

查看某张表的索引:SHOW INDEX FROM 表名;

创建普通索引:ALTER TABLE 表名 ADD INDEX  索引名 (加索引的列)

创建聚合索引:ALTER TABLE 表名 ADD INDEX 索引名 (加索引的列1,加索引的列2)

删除某张表的索引:DROP INDEX 索引名 ON 表名;

四、EXPLAIN 分析SQL执行的状态

EXPLAIN列的解释

table                    显示这一行的数据是关于哪张表的

type                     这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys     显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key                      实际使用的索引。如果为NULL,则没有使用索引。

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

ref                       显示索引的哪一列被使用了,如果可能的话,是一个常数

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

Extra                   关于MYSQL如何解析查询的额外信息。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Extra字段值含义:

Distinct                   一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

Not exists               MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了

Range checked for each Record(index map:#)      没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort          看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

Using index            列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

Using temporary    看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

Where used           使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

type字段值含义:

const       表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待

eq_ref     连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref           这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

range      这个连接类型使用索引返回一个范围中的行,比如使用>或

index       这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)

ALL         这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

五、性能测试

(一)、测试环境

测试环境:博主家用台式机

处理器为AMD FX(tm)-8300 Eight-Core Processor 3.2GHz;

内存8G;

64位 windows 7。

MySQL: 5.6.17

(二)、MyISAM引擎测试

1). 创建一张测试表

48304ba5e6f9fe08f3fa1abda7d326ab.png

DROP TABLE IF EXISTS `test_user`;

CREATE TABLE `test_user` (

`id` bigint(20) PRIMARY key not null AUTO_INCREMENT,

`username` varchar(50) DEFAULT NULL,

`email` varchar(30) DEFAULT NULL,

`password` varchar(32) DEFAULT NULL,

`status` tinyint(1) NULL DEFAULT 0

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

48304ba5e6f9fe08f3fa1abda7d326ab.png

存储引擎使用MyISAM是因为此引擎没有事务,插入速度极快,方便我们快速插入千万条测试数据,等我们插完数据,再把存储类型修改为InnoDB。

2).  使用存储过程插入1千万条数据

48304ba5e6f9fe08f3fa1abda7d326ab.png

create procedure myproc()

begin

declare num int;

set num=1;

while num <= 10000000 do

insert into test_user(username,email,password) values(CONCAT('username_',num), CONCAT(num ,'@qq.com'), MD5(num));

set num=num+1;

end while;

end

48304ba5e6f9fe08f3fa1abda7d326ab.png

3).  执行  call myproc();

由于使用的MyISAM引擎,插入1千万条数据,仅耗时246秒,若是InnoDB引擎,插入100万条数据就要花费数小时了。

MyISAM引擎之所以如此之快,一个原因是使用了三个文件来存储数据,frm后缀存储表结构、MYD存储真实数据、MYI存储索引数据。

每次进行插入时,MYD的内容是递增插入,MYI是一个B+树结构,每次的索引变更需要重新组织数据。

但相对于InnoDB来说,MyISAM更快。

4). sql测试

1. SELECT id,username,email,password FROM test_user WHERE id=999999

耗时:0.114s。

因为我们建表的时候,将id设成了主键,所以执行此sql的时候,走了主键索引,查询速度才会如此之快。

2. 我们再执行: SELECT id,username,email,password FROM test_user WHERE username='username_9000000'

耗时:4.613s。

用EXPLAIN分析一下:

eb52d2676cfa7b5f3469bcf05ac9ae38.png

信息显示进行了全表扫描。

3. 那我们给username列加上普通索引。

ALTER TABLE `test_user` ADD INDEX index_name(username) ;

此时,Mysql开始对test_user表建立索引,查看mysql 数据目录:

93c30dd0d0d584de6d48e39c6c84eb58.png

a1ea27a67535669934f2a3d781c6452f.png

查看目录文件列表,可以看到新建了三个临时文件,新的临时数据表MYD文件大小并未变更,临时索引文件MYI文件大小增加了很多。

查看执行结果:

4a9e8d515e30ac8de9c052a1b00b91c0.png

此过程大约耗时 221.792s,建索引的过程会全表扫描,逐条建索引,当然慢了。

等执行完毕后,mysql把旧的数据库文件删除,再用新建立的临时文件替换掉之。(删除索引过程也是同样的步骤)。

4. 再来执行:select id,username,email,password from test_user where username='username_9000000'

耗时:0.001s。

可见查询耗时提高的很可观。

用EXPLAIN分析一下:

433538952e2f8d78d538d6c5e3bc6d85.png

Extra 字段告诉我们使用到了索引 index_name,和之前的EXPLAIN结果对比,未建立索引前进行了全部扫描,建立索引后使用到了索引,查询耗时对比明显。

5. 再用username和password来联合查询

SELECT id, username, email, PASSWORD FROM test_user WHERE `password` = '7ece221bf3f5dbddbe3c2770ac19b419' AND username = 'username_9000000';

耗时:0.001s

执行 EXPLAIN :

3384bb17ba8c769846f93aef502c1df2.png

显示使用到了 index_name 索引,条件语句不分password、useranme先后顺序,结果都是一样。说明sql优化器优先用索引命中。

6. 我们再执行:SELECT id, username, email, PASSWORD FROM test_user WHERE `password` = '7ece221bf3f5dbddbe3c2770ac19b419' OR username = 'username_900000'

此时虽然我们已经对 username 加了索引,但是password列未加索引,索引执行password筛选的时候,还是会全表扫描,因此此时查询速度立马降了下来。

0849d6049120da087f5e240eadd3a05f.png

耗时:5.118s。

EXPLAIN一下:

d7a68a50a1d518564340dc5ce7ef1427.png

使用OR条件的时候,虽然WHERE 语句中有用到索引字段,但还是进行了全表扫描。

7. 当我们的sql有多个列的筛选条件的时候,就需要对查询的多个列都加索引组成聚合索引:

加上聚合索引:ALTER TABLE `test_user` ADD INDEX index_union_name_password(username,password)

72b7be03a6f211591cb9e42fa939fd52.png

通过临时文件的大小来看,索引文件的大小已经超过了数据文件很多了。索引侧面来说,索引要合理利用,索引就是用空间换时间。

[SQL]ALTER TABLE `test_user` ADD INDEX index_union_name_password(username,password)

受影响的行: 10024725。

时间: 1399.785s。

8. 再来执行:[SQL] SELECT id, username, email, PASSWORD FROM test_user WHERE username = 'username_900000' OR `password` = '7ece221bf3f5dbddbe3c2770ac19b419'

耗时:4.416s。

EXPLAIN:

2b061f1da7a44ef756b652d15aed1b6c.png

竟然是全表扫描,不可思议!!! 使用 OR 语句竟然没有启用聚合索引,也没使用到单索引username,,,

9. 再来执行:[SQL] SELECT id, username, email, PASSWORD FROM test_user WHERE username = 'username_900000' AND `password` = '7ece221bf3f5dbddbe3c2770ac19b419'

耗时:0.001s。

EXPLAIN:

fcdbb0b63006ece1d930db45a295df43.png

AND 语句才使用到了聚合索引,聚合索引必须使用AND条件,同时要符合最左原则,请戳我。

10. 主键区间查询

[SQL]EXPLAIN SELECT id, username, email, PASSWORD FROM test_user WHERE id > 8999990 AND id < 8999999

受影响的行: 0

时间: 0.001s。

b4f69e17721513abddbce98434f26c83.png

命中7行,查询时间很短。

[SQL]SELECT id, username, email, PASSWORD FROM test_user WHERE id > 8999900 AND id < 8999999

受影响的行: 0

时间: 0.010s

[SQL]SELECT id, username, email, PASSWORD FROM test_user WHERE id > 8999000 AND id < 8999999

受影响的行: 0

时间: 0.029s

[SQL]SELECT id, username, email, PASSWORD FROM test_user WHERE id > 8990000 AND id < 8999999

受影响的行: 0

时间: 0.139s

通过不断加大区间来看,查询时间跟查询的数据量成相对的正比增长,同时使用到了主键索引。

11. 字符串区间查询

[SQL]SELECT id, username, email, PASSWORD FROM test_user WHERE username > 'username_800000' AND `password` > '7ece221bf3f5dbddbe3c2770ac19b419'

受影响的行: 0

时间: 6.059s

EXPLAIN:

9709f2561dcd314a8694df46876d87ec.png

未使用索引和聚合索引,进行了全表扫描。

[SQL]SELECT id, username, email, PASSWORD FROM test_user WHERE username > 'username_900000' AND `password` > '7ece221bf3f5dbddbe3c2770ac19b419'

受影响的行: 0

时间: 11.488s

EXPLAIN:

ea529b04625c11f89b7abbf9adf807be.png

也使用到了索引和聚合索引。

对比得出,字符串进行区间查询,是否能使用到索引的条件得看mysql是如何优化查询语句的。

12.最左原则

1]. 新建 A、B、C 聚合索引

[SQL]ALTER TABLE `test_user` ADD INDEX index_union_name_email_password(username,email,password)

受影响的行: 10024725

时间: 3171.056s

2]. SQL 测试

d087ab3290a79b3d3ba4de526ab42e48.png

慎用 OR 条件,可能将会导致全表扫描。

覆盖了 A、B、C 索引:

f1fe4169e37e20790376b3b9813f5fc9.png

该语句使用了覆盖索引,WHERE 语句的先后顺序并不影响。MySQL会对SQL进行查询优化,最终命中ABC索引。

命中了 A、B、C 索引中的 AB组合,查询耗时很短:

8ad31464908eb1ff8648552739eec6b9.png

没有命中到 A、B、C 索引,所以进行了全表扫描,查询耗时长。

13658c8f29fd88bf3ef7ca1a663846ef.png

小结:

要使用覆盖索引必须都是 AND 条件,慎用 OR 条件。

要使用覆盖索引如ABC,需满足条件语句中有 A、AB、ABC才会使用覆盖索引,采用最左原则。

(三)、InnoDB引擎测试

1). 新建 InnoDB  表

根据上文的步骤,新建一个 test_user_innodb  表,引擎使用MyISAM,然后将存储引擎修改回InnDB。

使用如下命令:  ALTER TABLE test_user_innodb ENGINE=InnoDB; 此命令执行时间大约耗时5分钟,耐心等待。

[SQL]ALTER TABLE test_user_innodb ENGINE=InnoDB;

受影响的行: 10024725

时间: 692.475s

执行完毕后, test_user_innodb 表由之前的 三个文件 变为 两个文件,test_user_innodb.frm 和 test_user_innodb.idb。

其中frm文件记录表结构,idb文件记录表中的数据,其实就是一个B+树索引文件,不过该树的叶子节点中的数据域记录的是整行数据记录。

所以 Innodb 的查找次数比 MyISAM 表减少一次磁盘IO查找逻辑,但相对来说,插入数据也就没有MyISAM 快了,有所求就有所得吧!

同时 InnoDB 支持行锁、表锁,InnoDB 的锁机制是建立在索引上的,所以如果没命中索引,那么将是加表锁。

2). SQL 测试

1. [SQL]SELECT id,username,email,password FROM test_user_innodb WHERE username='username_9000000'

受影响的行: 0

时间: 14.540s

eac0a5fe56e5c9aba83fd36cb419e22d.png

显示进行了全表扫描,但跟MyISAM表对比来说,扫描的行数小了很多,可能这就是底层B+树布局不一样导致的吧。

2. 那我们给username列加上普通索引。

ALTER TABLE `test_user_innodb` ADD INDEX index_name(username) ;

此时,Mysql开始对 test_user_innodb 表建立索引,查看mysql 数据目录:

85232d054c0403e9955ea6d2464adb31.png

仔细观察,发现只生成了一个表结构临时文件。ibd文件容量在不断增大。这个跟MyISAM表加索引逻辑不一样。

[SQL]ALTER TABLE `test_user_innodb` ADD INDEX index_name(username) ;

受影响的行: 0

时间: 157.679s

此过程大约耗时 157.679s, 貌似建索引的过程未进行全表扫描,对比MyISAM表减少60s左右。为何如何?估计需要看底层实现了!

3. 再执行 SELECT id,username,email,password FROM test_user_innodb WHERE username='username_9000000'

[SQL]SELECT id,username,email,password FROM test_user_innodb WHERE username='username_9000000'

受影响的行: 0

时间: 0.001s

可见查询耗时减少的很可观,对比与未加索引。用EXPLAIN分析一下,和MyISAM表没有多少差别。

4a974223298cfc96804bc285195d367d.png

4. 再用username和password来联合查询

SELECT id, username, email, PASSWORD FROM test_user_innodb  WHERE `password` = '7ece221bf3f5dbddbe3c2770ac19b419' AND username = 'username_9000000';

耗时:0.001s

执行 EXPLAIN :

37c5595fcab64b833a88ac3e10b67943.png

显示使用到了 index_name 索引,条件语句不分password、useranme先后顺序,结果都是一样。说明sql优化器优先用索引命中。

5. 我们再执行:SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE `password` = '7ece221bf3f5dbddbe3c2770ac19b419' OR username = 'username_900000'

此时虽然我们已经对 username 加了索引,但是password列未加索引,索引执行password筛选的时候,还是会全表扫描,因此此时查询速度立马降了下来。

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE `password` = '7ece221bf3f5dbddbe3c2770ac19b419' OR username = 'username_900000'

受影响的行: 0

时间: 10.719s

EXPLAIN一下:

f8722270b29554e5feaee055140c720c.png

使用OR条件的时候,虽然WHERE 语句中有用到索引字段,但还是进行了全表扫描。

对比MyISAM 表来说,没有多大却别,唯一的就是rows行数不一样。

6. 加上聚合索引:ALTER TABLE `test_user_innodb` ADD INDEX index_union_name_password(username,password)

此时,Mysql开始对 test_user_innodb 表建立索引,查看mysql 数据目录,和之前的一样,新增了一个临时表结构文件,ibd文件不断增大。

[SQL]ALTER TABLE `test_user_innodb` ADD INDEX index_union_name_password(username,password)

受影响的行: 0

时间: 348.613s

建立索引的时间比MyISAM 快。

7. 再来执行:[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE `password` = '7ece221bf3f5dbddbe3c2770ac19b419' OR username = 'username_900000'

受影响的行: 0

时间: 10.357s

8409b694cdde050019be1482bb2ce503.png

对比MyISAM 竟然是慢了6s左右? 和MyISAM 的全表扫描无差别。

InnoDB的OR查询性能没有MyISAM 快,应该是为了实现事务导致的性能损失?

8. 再来执行:[SQL] SELECT id, username, email, PASSWORD FROM test_user WHERE username = 'username_900000' AND `password` = '7ece221bf3f5dbddbe3c2770ac19b419'

耗时:0.001s。

EXPLAIN:

40af0a55a969e0f42e7accf809f5f04a.png

AND 语句才使用到了聚合索引,聚合索引必须使用AND条件,同时要符合最左原则,请戳我。

9. 主键区间查询

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE id > 8999990 AND id < 8999999

受影响的行: 0

时间: 0.000s

e8029a99c6131faf20b281b8bf41b4d6.png

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE id > 8999900 AND id < 8999999

受影响的行: 0

时间: 0.001s

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE id > 8999000 AND id < 8999999

受影响的行: 0

时间: 0.003s

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE id > 8990000 AND id < 8999999

受影响的行: 0

时间: 0.022s

通过不断加大区间来看,查询时间跟查询的数据量成相对的正比增长,同时使用到了主键索引。

相对于MyISAM 表来说,主键区间查询的耗时小很多很多!看来只能用底层的B+树的实现不一样来解释了!

MyISAM 的B+树子节点的叶子节点数据域,存储的是数据在MYD文件中的数据地址。

InnoDB  的B+树子节点的叶子节点数据域,存储的是整行数据记录,这个节省了一次硬盘IO操作,应该是这个特点导致了主键区间查询比MyISAM 快的原因。

10. 字符串区间查询

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE username > 'username_800000' AND `password` > '7ece221bf3f5dbddbe3c2770ac19b419'

受影响的行: 0

时间: 12.506s

932f3549e6b8e285c1633816558e6ddd.png

未使用索引和聚合索引,进行了全表扫描。

缩小区间在查询

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE username > 'username_900000' AND `password` > '7ece221bf3f5dbddbe3c2770ac19b419'

受影响的行: 0

时间: 12.213s

[SQL]SELECT id, username, email, PASSWORD FROM test_user_innodb WHERE username > 'username_1000000' AND `password` > '7ece221bf3f5dbddbe3c2770ac19b419'

受影响的行: 0

时间: 19.793s

11.最左原则

1]. 新建 A、B、C 聚合索引

[SQL]ALTER TABLE `test_user_innodb` ADD INDEX index_union_name_email_password(username,email,password)

受影响的行: 0

时间: 588.579s

对比MyISAM 表来说,建立该索引的时间是其的1/6之一。建立索引的时间相对可观。磁盘占用来说InnoDB总量更小。

2]. SQL 测试

2d62c8c78fde0a4c886ef4d6302c18aa.png

和MyISAM 表对比,竟然没使用到全表扫描,而且使用到了聚合索引。

覆盖了 A、B、C 索引:

e982b21db8a08097c5b72bac9151d578.png

该语句使用了覆盖索引,WHERE 语句的先后顺序并不影响。MySQL会对SQL进行查询优化,最终命中ABC索引。

命中了 A、B、C 索引中的 AB组合,查询耗时很短:

f699f02e4cee56c15e4924244f09c3e7.png

没有命中到 A、B、C 索引最左原则,竟然不是全表扫描,而是使用了索引。

4197e6092abd8d7d16a63f318908ce03.png

和MyISAM 表对比,MyISAM 表是全表扫描,而InnoDB却是使用到了索引。

六、总结

两大引擎MyISAM、InnoDB分析:

背景:

数据记录:10024725行

表索引:  主键、A、AB、ABC

相同点:

1.都是B+树的底层实现。

2.WHERE条件都符合索引最左匹配原则。

不同点:

1.MyISAM的存储文件有三个,frm、MYD、MYI 文件;InnoDB的存储文件就两个,frm、ibd文件。总文件大小InnoDB引擎占用空间更小。

2.InnoDB的存储文件本身就是索引构成,建立新索引的时间比MyISAM快。

3.MyISAM比InnoDB查询速度快,插入速度也快。

4.主键区间查询,InnoDB查询更快。字符串区间查询,MyISAM相对更快。

5.有A、AB、ABC索引的情况下,A OR B 查询,InnoDB查询性能比MyISAM慢。不建议使用OR 条件进行查询。

6.InnoDB表没有命中到 A、B、C 索引最左原则时,BC组合查询命中了索引,但还是完全扫描,比全表扫描快些。MyISAM是全表扫描。

开篇也说过软件层面的优化一是合理加索引;二是优化执行慢的sql。

此二者相辅相成,缺一不可,如果加了索引,还是查询很慢,这时候就要考虑是sql的问题了,优化sql。

实际生产中的sql往往比较复杂,如果数据量过了百万,加了索引后效果还是不理想,使用集群、垂直或水平拆分。

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

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

相关文章

mysql5.7.24 安装步骤_MySQL5.7.24解压版安装步骤

网上安装MySQL数据库的教程有.msi格式包安装和.zip格式解压安装&#xff0c;zip安装我个人感觉安装方式纯净又能学习更多知识&#xff0c;因此我更倾向于zip安装。一、下载并解压前往MySQL官网下载5.7.24版本https://dev.mysql.com/downloads/下拉移动看见select Version 选择m…

mysql utf8mb4 造成慢_mysql使用utf8mb4经验吐血总结

1. utf8 与 utf8mb4 异同1234The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. The utf8mb4 character set uses a maximum of four bytes per character supports supplementary characters:- For a BMP charact…

java移动接口发短信_Java面试零碎知识点

1.Java文件经过JVM编译成字节码文件&#xff0c;即.class文件&#xff0c;将字节码文件在不同的操作系统中运行时&#xff0c;操作系统再将字节码文件编译成机器码文件。这就是Java跨平台2.首先明确一点&#xff0c;java 的 GC 回收是完全自动的&#xff0c;没有提供相关 api 手…

java重定向代码_Java程序员经典面试题集大全 (三十四)

341. Servlet API中forward() 与redirect()的区别&#xff1f;答&#xff1a;为实现程序的模块化&#xff0c;就需要保证在不同的Servlet之间可以相互跳转&#xff0c;而Servlet中主要有两种实现跳转的方式&#xff1a;FORWARD方式与redirect方式。 Forward() : 是服务器内部的…

mysql用户阻塞数_MySQL实例阻塞分析一例(线程statistics状态)

本文用实例来分析MySQL阻塞—线程statistics状态。一、 现象某日下午下班后低峰期&#xff0c;现网MySQL一个库突然报出大量慢sql&#xff0c;状态是 statistics&#xff0c;但是过后拿这些sql去执行的时候&#xff0c;实际很快。处于 statistics 状态的线程有个特征&#xff1…

无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...

自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的&#xff0c;它包含的值可以在整个文档中重复使用。由自定义属性标记设定值(比如&#xff1a;--main-color: black;)&#xff0c;由var() 函数来获取值(比如&#xff1a;color: var(--main-color);)复杂的网站都…

斐波那契数列不用数组_兔子数列——斐波那契数列

相信人们都对斐波那契数列有或多或少的了解&#xff0c;如果没有&#xff0c;那你一定听过黄金分割比或是见过下面这种图片&#xff1a;斐波那契生活在十三世纪的意大利&#xff0c;原名列奥纳多皮萨诺(Leonardo Pisano)&#xff0c;他出生在意大利那个后来因为伽里略做过自由落…

sqlserver服务启动失败_条码打印软件连接SQL数据库出现TCP连接失败解决办法

小编今天用条码打印软件连接SQL 数据库遇到了一个问题&#xff1a;通过端口1433连接到主机localhost的TCP/IP连接失败。错误&#xff1a;“Connection refused&#xff1a;connect。请验证连接属性。确保SQL Server的实例正在主机上运行&#xff0c;且在此端口接收TCP/IP连接&a…

mysql57win10安装配置_Win10 OS安装(配置)MySQL 5.7(解压版)

Win10 OS安装(配置)MySQL 5.7(解压版)下载及解压文件名&#xff1a;mysql-5.7.27-win32.zipzip是解压版&#xff0c;msi是安装版&#xff0c;本教程仅说明zip格式的配置方法。解压(假设解压后根路径为D:\ide\mysql-5.7.27-win32)相关截图添加环境系统变量path 增加D:\ide\mysql…

pep8 python 编码规范_如何用好python编码规范,写一手漂亮的代码

前一段时间在编写python 代码的时候编辑器中一直在提示规范问题&#xff0c;因为强迫症的原因&#xff0c;我决定遵循python 的编码规范去编码&#xff0c;然后把需要注意的点记录下来&#xff0c; 帮助自己和大家一起成长。这是我的main.py文件中的一部分代码&#xff0c;经过…

mysql约束_Mysql约束条件

约束条件1约束条件约束是一种限制&#xff0c;通过对表中的数据做出限制&#xff0c;来确保表中数据的完整性&#xff0c;唯一性默认约束CREATE TABLE tb(id INT DEFAULT a ,name VARCHAR(20));插入数据的时候&#xff0c;如果没有明确为字段赋值&#xff0c;则自动赋予默认值在…

解决方案和项目的关系_项目经理入门知识系列之《项目团队的职责分工》

项目团队的组织结构组织结构项目经理职责整合制定项目计划所需的活动。整合执行项目计划所需的活动。整合进行范围变更所需的活动。1、目经理负责对横跨多个职能线的活动进行协调和整合。整合管理2、项目经理核心技能---沟通能力(因为他的权力太少了)如果一个人有良好的沟通与人…

数据库字段 到类 java bean_将数据库中表的字段自动转换为javaBean实体类

具体代码如下&#xff1a;package param;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Resul…

el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...

抖音小视频已经成为风靡全国的一个app了&#xff0c;很多人都喜欢看抖音来打发时间&#xff0c;而经常看小视频的应该都见到过这种现象&#xff0c;就是有一些小视频我们在观看的时候&#xff0c;发现这个小视频的上下都有黑色边框或者模糊的效果&#xff0c;实际这都是一些拍摄…

java synchronized 静态_Java之Synchronized修饰实例方法和静态方法

一、Synchronized修饰实例方法&#xff0c;实际上是对调用该方法的对象加锁&#xff0c;俗称“对象锁”情况一&#xff1a;​同一个对象在两个线程中分别访问该对象的两个同步实例方法结果&#xff1a;会产生互斥​原因&#xff1a;因为锁针对的是对象&#xff0c;当对象调用​…

网站漏洞扫描工具_如何实现免费网站漏洞扫描?推荐一款神器给你

网站漏洞想必有网站的人都比较了解&#xff0c;想要了解网站漏洞&#xff0c;最好的办法就是给网站做一次漏洞扫描&#xff0c;网站漏扫产品比较多&#xff0c;费用也从几十/次到几千/次不等&#xff0c;但是对于我这种小企业来说&#xff0c;几千一次也是非常贵的&#xff0c;…

java mvc设计模式_JavaEE知识点:MVC设计模式

MVC全名是Model View Controller&#xff0c;是模型(model)-视图(view)-控制器(controller)的缩写&#xff0c;是一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及…

mysql 导出数据字典_操作MySQL?这个库比pymysql香一百倍

原创&#xff1a; 阿亮 Python极客社区操作MySQL&#xff0c;我们都习惯于用pymsq&#xff0c;基本流程就是创建连接创建游标执行SQL关闭连接代码是这样的import pymysql# 1.创建连接conn pymysql.connect(host127.0.0.1, port3306, userroot, passwordroot, charsetutf8)# 2.…

java putifabsent_java8中Map的一些骚操作总结

一 前言本篇内容是关于 map 新特性的一些方法使用上的介绍&#xff0c;如果有不足之处欢迎补充&#xff01;&#xff01;二 map新特性关于以下函数式编程的函数的计算知识追寻者都使用 简单字符串代替了&#xff0c;参数无非就是Key,value&#xff1b;2.1 forEachforEach迭代&a…

java 注解 target_详解JDK 5 Annotation 注解之@Target的用法

前言目前&#xff0c;越来越多的架构设计在使用注解&#xff0c;例如spring3.0、struts2等框架。让我们先来看看注解的定义。如下是一段使用了JDK 5 Annotation Target的代码&#xff1a;Target({ElementType.METHOD})Retention(RetentionPolicy.RUNTIME)InheritedDocumentedpu…