# testtest **Repository Path**: pious68/testtest ## Basic Information - **Project Name**: testtest - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-22 - **Last Updated**: 2024-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 1.windows查看端口是否被占用以及对应的进程号 ``` netstat -ano|findstr 3306 tasklist|findstr 7652 taskkill /T /F /PID 7652 ``` ### 2.大bug--MySQL8在windows上没有启动--捣鼓了半天-发现是MySQL Data文件夹角色权限的文件--最简单解决办法就是先压缩到文件,然后将原来的删除,然后解压,然后从回收钻和你回复就可以了 ### 3.第2章-MySQL ```以下测试均在101.34.254.242机器上进行: 1.网站页面出现访问错误: 数据库连接超时:数据库连接池已满/查询的数据量比较大引起数据库线程挂起 慢查询造成页面无法加载:数据查询比较慢,数据库表较为庞大膨胀得很厉害 阻塞造成数据无法提交:锁表 2.show variables like 'slow_query_log'; show variables like '%slow_query_log%'; set global slow_query_log=on; show variables like 'long_query_time'; set global long_query_time=1;(设置后需要重写开一个session) tail -f /www/server/data/mysql-slow.log; select sleep(4); 3.create database test; use test; create table t1(id int,name varchar(25)); 利用存储过程插入10w条数据: 分别利用存储过程向t1表和tt1表插入数据查看慢查询日志. 调用存储过程也会触发慢查询. 【存储过程:向test库的t1表中插入10w条数据】 DROP PROCEDURE IF EXISTS pro_t1; delimiter $$ create procedure pro_t1() begin declare i int; set i=0; while i<100000 do insert into t1 (id,name) values(i,CONCAT('pious-',i)); set i=i+1; end while; end $$ delimiter ; 4.调用存储过程生成10w条数据:在navicat命令行执行比默认cmd或者phpmyadmin速度快 call pro_t1(); 5. 终止存储过程: show full processlist; kill {id}; select * from t1; 100000 rows in set (0.02 sec) 0.02s是把数据从数据库中捞出来的时间并非发送给客户端时间,滚屏显示是发送给客户端的时间,因此此处不会进入慢查询。 update t1 set name = 'pious68' where id = '99999'; 6.不要轻易打开-日志膨胀特别快-设置所有查询均记录进慢日志: set global log_queries_not_using_indexes=on; 7.jMeter压测mysql: connector.jar放入jMeter的bin目录下: 慢查询日志:rows_sent为发送给客户端的数据,rows_examined为检测的行数,如果相差过大则代表查询效率很低 jmeter对mysql压测:mysql-connector-java-8.0.29.jar放入jmeter的bin目录下和lib目录下 101.34.254.242搭建的mysql8压测时无法获取链接: Response message:java.sql.SQLException: Cannot create PoolableConnectionFactory (null, message from server: "Host '115.205.69.228' is not allowed to connect to this MySQL server") use mysql; select 'host' from user where user='root'; update user set host = '%' where user ='root'; flush privileges; ``` ### 4.第3章-MySQL ``` 1.mysqldumpslow windows下: mysqldumpslow不是内部或外部命令:发现bin目录下只有mysqldumpslow.pl文件,因此下载perl程序 http://pan.baidu.com/s/1i3GLKAp 可能会出现bin目录添加环境变量还是不行,那么直接在bin目录下打开cmd就可以了,并且需要终端管理员权限 perl mysqldumpslow.pl --help(看都有哪些参数) perl mysqldumpslow.pl --verbose D:\Softwares\MySQLData\Data\PIOUS-slow.log perl mysqldumpslow.pl --verbose D:\Softwares\MySQLData\Data\PIOUS-slow.log -s ar perl mysqldumpslow.pl --verbose D:\Softwares\MySQLData\Data\PIOUS-slow.log -s ar -t 3 eg:Time=49.00s(97s) 前面为平均时间,后面为总时间,排序的时候按照总时间排序 mysqldumpslow --help mysqldumpslow --verbose /var/lib/mysql/VM-0-10-centos-slow.log mysqldumpslow --verbose /var/lib/mysql/VM-0-10-centos-slow.log --help mysqldumpslow --verbose /var/lib/mysql/VM-0-10-centos-slow.log -s ar 2.pt-query-digest 官网地址: https://www.percona.com/software/database-tools/percona-toolkit 官网没有提供windows版本: https://blog.csdn.net/banche163/article/details/103847851 可以在下面访问对应的脚本内容,然后保存在pt-query-digest.pl到bin目录下完成windows系统的使用 https://raw.githubusercontent.com/percona/percona-toolkit/3.5.0/bin/pt-query-digest bin目录下执行: perl pt-query-digest.pl --help linux系统: https://www.percona.com/software/database-tools/percona-toolkit yum localinstall -y percona-toolkit-3.5.3-1.el7.x86_64.rpm pt-query-digest --help pt-summary pt-diskstats(可看磁盘IO使用率)/类top命令 pt-mysql-summary --user=root --password=eec267e1a54f2c1b pt-query-digest /www/server/data/mysql-slow.log(mysqldumpslow --verbose /var/lib/mysql/VM-0-10-centos-slow.log) pt-query-digest --limit=100% /www/server/data/mysql-slow.log(全部显示不折叠) pt-slave-find --host=localhost --user=root --password=eec267e1a54f2c1b(主从复制时候可以用此命令查看) 这个命令开发的同学经常会用,通常会用来进行故障排查,当怀疑系统发生死锁的时候或者已经发生死锁的时候就可以执行这个命令进行查看: pt-deadlock-logger --run-time=10 --interval=3 --create-dest-table --dest D=ceshi,t=deadlocks u=ceshi,p=ceshi(指定数据库名、账号、密码都为ceshi,会自动帮我们创建deadlocks这张表) 报错:Error getting SHOW ENGINE INNODB STATUS: DBD::mysql::db selectrow_hashref failed: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation [for Statement "SHOW /*!40100 ENGINE*/ INNODB STATUS /* pt-deadlock-logger */"] at /usr/bin/pt-deadlock-logger line 4847. ==>解决无效: grant process on *.* to 'ceshi'@'%'; ==>pt-deadlock-logger --run-time=10 --interval=3 --create-dest-table --dest D=ceshi,t=deadlocks u=root,p=eec267e1a54f2c1b(改用root账号即可) 2个客户端模拟死锁: client1: use test; set autocommit=0; select * from t1 where id = 1 for update; client2: use test; set autocommit=0; select * from t2 where id = 1 for update; client1执行:select * from t2 where id = 1 for update; ==> 锁住 client2执行:select * from t1 where id = 1 for update; ==> 报错:Deadlock found when trying to get lock; try restarting transaction() 上面都执行后pt-deadlock-logger才会打印死锁信息,并将3死锁信息输出到数据库中 pt-index-usage --user=root --password=eec267e1a54f2c1b --host=localhost /www/server/data/mysql-slow.log 此命令报错: DBD::mysql::db selectall_arrayref failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(id,name) values(i,CONCAT('pious',i)); where i=i+1; end while; end' at line 1 [for Statement "EXPLAIN select * from t2 (id,name) values(i,CONCAT('pious',i)); where i=i+1; end while; end "] at /usr/bin/pt-index-usage line 4639, <> line 19. 原因在于我将long_query_time的时间设置为0.01导致存储过程也写入到了慢查询日志中,而此命令貌似不能够正确解析存储过程慢查询日志。 报如下错误是因为慢查询对应的数据库已经被删除了: DBD::mysql::db do failed: Unknown database 'db_imooc' [for Statement "USE `db_imooc`"] at /usr/bin/pt-index-usage line 6736, <> line 1. drop procedure pro_t1; drop procedure pro_t2; pt-duplicate-key-checker --host=localhost --user=root --password=eec267e1a54f2c1b pt-ioprofile pt-config-diff /etc/my.cnf /root/my_master.cnf pt-find --user=root --password=eec267e1a54f2c1b --tablesize +1M pt-find --user=root --password=eec267e1a54f2c1b --printf "%T\t%D.%N\n" | sort -rn ......具体命令看图片吧....... ``` ### 5.第4章-Mysql ``` SQL执行计划; id:执行计划可能有很多步,1表示第1个步骤;执行步骤从大到小;id同执行顺序从上至下;为null表示这是一个结果集,不需要用它进行查询 type:连接的类型,all为全表扫描 ref:索引在哪一列上 rows:估计扫描的行数 filted:经过服务器过滤后返回给客户端的数据的百分数 1.explain select (select 1 from actor limit 1) from film \G 2.explain select film_id from (select film_id from film) as dr \G ==>mysql8中执行计划就1步,而5.6中分为2步 3.simple: explain select * from film where film_id = 1; 4.primary:(8版本2步,5.6版本3步) explain select film_id from film union all select film_id from film_actor; 上面这个语句在8中2步,而在5.6中额外加上union result共3步 mysql8中没有union result了,在5.6中存在 5.dependent union: explain select * from film_category where film_id in(select film_id from film union all select film_id from film_actor); 6.subquery: explain select (select 1 from actor limit 1) from film; 7.dependent subquery: explain select * from film_category where film_id in(select film_id from film union all select film_id from film_actor); ``` ### 6.第5章-Mysql ``` join的时候默认会选择数据量小的表作为驱动表,但是如果带了连接字段则不一定 select * from t1 join t3 on t1.id = t3.id ==> t1 10w条数据 t3 7条数据 ==> 通过explain发现使用t1作为了驱动表。因为驱动表是用作遍历的,mysql会选择一个没用索引作为条件的表作为驱动表,而在我们的表结构中t1表的id没有索引,而t3表的id有索引(走join buffer--效率低--但是相对于一行一行的取出有所改进--一次性取出批量数据,假设1次取出10w数据,要遍历100w条那么只需要取出10次) ==> 当我们为t3表的id添加索引得到2个结果:1.执行更快 2.用数据量更少的t3表作为驱动表(有了索引走index不走join buffer) ==> 简单嵌套循环:考虑在被驱动表建立索引以降低算法开销,减少被驱动表扫描次数 索引嵌套循环:主键不需要回表,如果是辅助索引需要回表 ===> join 2表+限定条件都为主键走索引嵌套循环--而不是走块嵌套了 块嵌套循环:简单嵌套循环的优化,加了缓冲区joinBuffer,joinbuffer参数的大小决定了循环次数--[全表扫描] 正常来说都是先走块嵌套循环(需要回表),如果满足限定条件都为主键走索引嵌套循环(不用回表) 回表:考虑索引的结构 varchar(25)对应的索引大小:25*4+3=103(varchar变长需要+3) order by常规排序算法: explain select idc,name,id from t3 order by name\G 步骤:先将主键+查询的name列放入缓冲区,然后再根据id捞取对应的非索引字段放入,对应2个缓冲区: sort_buffer_size、read_rnd_buffer_size order by优化排序算法:对应参数:max_length_for_sort_data 排序元组大小小于4k就用优化排序算法 sql语句中使用where、order等多个条件时只会有1个键生效:where如果使用了索引,order也使用了索引,那么where会把索引抢占掉 ``` ### 7.第6章-Tomcat配置 ``` 5.7之前版本:索引失效的情况下使用group by有2个:using temptory和using fileSort(先排序后分组) 数据量太少explain不显示分组索引看不出来 松散索引扫描:先执行group by(不必读取整个索引)后执行where ==>using index for group-by 紧凑索引扫描:先执行where后执行group by(分组时读整个索引) ==>没有using index for group-by即走的是紧凑索引扫描 非索引扫描:效率最低 where、group组合使用:要想要group中的索引生效,要么where不走索引,要么where和group by属于同一个索引 b+和b的区别: 非叶子节点只存储键值信息不存储数据 所有的叶子节点之间都存在双向指针 b+树相对b树降低了树的高度,减少了磁盘物理IO的次数 高并发时候百万级数据库就不要使用链表查询了,会锁住太多的表,性能急剧下降 3500-4500QPS 一般的mysql就达到极限了 ``` ### 8.第7章-tomcat ``` servlet打war包教程:https://blog.csdn.net/kjahe/article/details/123351991 test-web打包war包部署服务器: 性能指标:看吞吐量、异常和平均值(响应时间) ``` ### 解决错误 ``` pt-slave-find --host=localhost --user=root --password=123456 DBI connect(';host=localhost;mysql_read_default_group=client','root',...) failed: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory at /usr/bin/pt-slave-find line 2023. 解决: use mysql; select user,host,plugin,authentication_string from user; +------------------+-----------+-----------------------+------------------------------------------------------------------------+ | user | host | plugin | authentication_string | +------------------+-----------+-----------------------+------------------------------------------------------------------------+ | root | % | caching_sha2_password | $A$005$iQZyU'xI0V<1,LTyXUFA59ZZgFvcxDb99wXWFdXGe6IpHF884MjsKQtcGM5 | | mysql.infoschema | localhost | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | mysql.session | localhost | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | mysql.sys | localhost | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | +------------------+-----------+-----------------------+------------------------------------------------------------------------+ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; flush privileges; 再次使用pt-slave-find --host=localhost --user=root --password=123456就不报错了 ``` ## Tomcat ``` 【Tomcat】 1-4:tomcat优化实操 5-10:tomcat线程与通道,tomcat高性能直接取决于使用的是哪个通道,每个通道都有不同的线程模型来支撑,通过了解tomcat线程模型了解J2EE领域绝大多数中间件的线程原理。Tomcat用到了Reactor线程模型,在redis和netty中都使用了该线程模型。 11-15:支撑tomcat高性能的重要参数以及特性。sendfile:零拷贝 compression:压缩技术 keep-alive长连接技术 tomcat10版本采用下面的配置: vim搜索 / 配置tomcat启动脚本允许jvisualVm远程链接: vim ./bin/catalina.sh /Exe搜索,在其上方添加脚本内容 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=101.34.254.242" 重启tomcat使用visualVm进行链接 tomcat使用连接池: 屏蔽原来的此处: 打开如下: jvisual vm连接tomcat ajp:看线程状态-->禁用ajp的重要性 屏蔽掉默认的connector连接器,放开Executor+指定connector: 4种运行模式: bio:同步阻塞 bio中调用read()方法如果没有数据会阻塞 nio:解决了accept()和read()方法的阻塞问题,底层调用操作系统底层的多路复用,selector的select()方法可以获取已经就绪的socket,所以在调用read()方法时不会阻塞住,在linux系统调用底层的epoll函数 nio2:纯异步模式-由操作系统把数据推送给我们 tomcat内部实现了preactor线程模型 APR: 下载源码通过源码启动tomcat 分别针对本地tomcat7、tomcat8进行压测:即分别针对bio和nio进行压测查看结果 然后针对放在服务器上的tomcat做nio2的压测:该server.xml中的一行即可: APR模式:根据教程安装centos ``` 7.测试tt1表; 【存储过程:向test库的tt1表中插入1k条数据】 DROP PROCEDURE IF EXISTS pro_tt1; delimiter $$ create procedure pro_tt1() begin declare i int; set i=0; while i<1000 do insert into tt1 (id,name) values(i,CONCAT('pious-',i)); set i=i+1; end while; end $$ delimiter ; call pro_tt1();