Day163,美团优选面试题java

.

日志分析命令 mysqldumpslow

mysqldumpslow是什么?

在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow。


查看 mysqldumpslow的帮助信息

[root@Heygo mysql]# mysqldumpslow --help

Usage: mysqldumpslow [ OPTS… ] [ LOGS… ]

Parse and summarize the MySQL slow query log. Options are

–verbose verbose

–debug debug

–help write this text to standard output

-v verbose

-d debug

-s ORDER what to sort by (al, at, ar, c, l, r, t), ‘at’ is default

al: average lock time

ar: average rows sent

at: average query time

c: count

l: lock time

r: rows sent

t: query time

-r reverse the sort order (largest last instead of first)

-t NUM just show the top n queries

-a don’t abstract all numbers to N and strings to ‘S’

-n NUM abstract numbers with at least n digits within names

-g PATTERN grep: only consider stmts that include this string

-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),

default is ‘*’, i.e. match all

-i NAME name of server instance (if using mysql.server startup script)

-l don’t subtract lock time from total time


mysqldumpshow 参数解释

  1. s:是表示按何种方式排序

  2. c:访问次数

  3. l:锁定时间

  4. r:返回记录

  5. t:查询时间

  6. al:平均锁定时间

  7. ar:平均返回记录数

  8. at:平均查询时间

  9. t:即为返回前面多少条的数据

  10. g:后边搭配一个正则匹配模式,大小写不敏感的


常用参数手册

  1. 得到返回记录集最多的10个SQL

mysqldumpslow -s r -t 10 /var/lib/mysql/Heygo-slow.log

  1. 得到访问次数最多的10个SQL

mysqldumpslow -s c- t 10/var/lib/mysql/Heygo-slow.log

  1. 得到按照时间排序的前10条里面含有左连接的查询语句

mysqldumpslow -s t -t 10 -g “left join” /var/lib/mysql/Heygo-slow.log

  1. 另外建议在使用这些命令时结合 | 和more使用,否则有可能出现爆屏情况

mysqldumpslow -s r -t 10 /var/lib/mysql/Heygo-slow.log | more

.

3、批量数据脚本


MySql函数与存储过程的区别

存储过程可以有返回值,也可以没有,函数有且仅有一个返回值

创建表

  • 建表 SQL

CREATE TABLE dept

(

deptno int unsigned primary key auto_increment,

dname varchar(20) not null default “”,

loc varchar(8) not null default “”

)ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE emp

(

id int unsigned primary key auto_increment,

empno mediumint unsigned not null default 0,

ename varchar(20) not null default “”,

job varchar(9) not null default “”,

mgr mediumint unsigned not null default 0,

hiredate date not null,

sal decimal(7,2) not null,

comm decimal(7,2) not null,

deptno mediumint unsigned not null default 0

)ENGINE=INNODB DEFAULT CHARSET=utf8;

设置参数

  • 创建函数,假如报错:This function has none of DETERMINISTIC………

  • 由于开启过慢查询日志,因为我们开启了bin-log,我们就必须为我们的function指定一个参数。

  • log_bin_trust_function_creators = OFF ,默认必须为 function 传递一个参数

mysql> show variables like ‘log_bin_trust_function_creators’;

±--------------------------------±------+

| Variable_name | Value |

±--------------------------------±------+

| log_bin_trust_function_creators | OFF |

±--------------------------------±------+

1 row in set (0.00 sec)

  • 通过 set global log_bin_trust_function_creators=1;我们可以不用为 function 传参

mysql> set global log_bin_trust_function_creators=1;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘log_bin_trust_function_creators’;

±--------------------------------±------+

| Variable_name | Value |

±--------------------------------±------+

| log_bin_trust_function_creators | ON |

±--------------------------------±------+

1 row in set (0.00 sec)

  • 这样添加了参数以后,如果mysqld重启,上述参数又会消失,永久方法在配置文件中修改‘

  • windows下:my.ini --> [mysqld] 节点下加上 log_bin_trust_function_creators=1

  • linux下:/etc/my.cnf --> [mysqld] 节点下加上 log_bin_trust_function_creators=1

创建函数,保证每条数据都不同

  • 随机产生字符串的函数

delimiter KaTeX parse error: Expected 'EOF', got '#' at position 2: #̲ 两个 表示结束

create function rand_string(n int) returns varchar(255)

begin

declare chars_str varchar(100) default ‘abcdefghijklmnopqrstuvwxyz’;

declare return_str varchar(255) default ‘’;

declare i int default 0;

while i < n do

set return_str = concat(return_str,substring(chars_str,floor(1+rand()*52),1));

set i=i+1;

end while;

return return_str;

end $$

  • 随机产生部门编号的函数

delimiter $$

create function rand_num() returns int(5)

begin

declare i int default 0;

set i=floor(100+rand()*10);

return i;

end $$

创建存储过程

  • 创建往emp表中插入数据的存储过程

delimiter $$

create procedure insert_emp(in start int(10),in max_num int(10))

begin

declare i int default 0;

set autocommit = 0;

repeat

set i = i+1;

insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values((start+i),rand_string(6),‘salesman’,0001,curdate(),2000,400,rand_num());

until i=max_num

end repeat;

commit;

end $$

  • 创建往dept表中插入数据的存储过程

delimiter $$

create procedure insert_dept(in start int(10),in max_num int(10))

begin

declare i int default 0;

set autocommit = 0;

repeat

set i = i+1;

insert into dept(deptno,dname,loc) values((start+i),rand_string(10),rand_string(8));

until i=max_num

end repeat;

commit;

end $$

调用存储过程

  • 向 dept 表中插入 10 条记录

DELIMITER ;

CALL insert_dept(100, 10);

12

mysql> select * from dept;

±-------±--------±-------+

| deptno | dname | loc |

±-------±--------±-------+

| 101 | aowswej | syrlhb |

| 102 | uvneag | pup |

| 103 | lps | iudgy |

| 104 | jipvsk | ihytx |

| 105 | hrpzhiv | vjb |

| 106 | phngy | yf |

| 107 | uhgd | lgst |

| 108 | ynyl | iio |

| 109 | daqbgsh | mp |

| 110 | yfbrju | vuhsf |

±-------±--------±-------+

10 rows in set (0.00 sec)

  • 向 emp 表中插入 50w 条记录

DELIMITER ;

CALL insert_emp(100001, 500000);

12

mysql> select * from emp limit 20;

±—±-------±------±---------±----±-----------±--------±-------±-------+

| id | empno | ename | job | mgr | hiredate | sal | comm | deptno |

±—±-------±------±---------±----±-----------±--------±-------±-------+

| 1 | 100002 | ipbmd | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 101 |

| 2 | 100003 | bfvt | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 107 |

| 3 | 100004 | | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 109 |

| 4 | 100005 | cptas | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 101 |

| 5 | 100006 | ftn | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 108 |

| 6 | 100007 | gzh | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 102 |

| 7 | 100008 | rji | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 100 |

| 8 | 100009 | | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 106 |

| 9 | 100010 | tms | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 100 |

| 10 | 100011 | utxe | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 101 |

| 11 | 100012 | vbis | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 104 |

| 12 | 100013 | qgfv | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 104 |

| 13 | 100014 | wrvb | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 105 |

| 14 | 100015 | dyks | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 109 |

| 15 | 100016 | hpcs | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 101 |

| 16 | 100017 | fxb | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 108 |

| 17 | 100018 | vqxq | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 102 |

| 18 | 100019 | rq | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 102 |

| 19 | 100020 | l | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 106 |

| 20 | 100021 | lk | salesman | 1 | 2020-08-05 | 2000.00 | 400.00 | 100 |

…省略…

| 499984 | 599985 | l | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 104 |

| 499985 | 599986 | fvt | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 103 |

| 499986 | 599987 | xnal | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 101 |

| 499987 | 599988 | vj | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 100 |

| 499988 | 599989 | sch | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 105 |

| 499989 | 599990 | g | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 107 |

| 499990 | 599991 | dcfrs | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 109 |

| 499991 | 599992 | hxsu | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 103 |

| 499992 | 599993 | o | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 107 |

| 499993 | 599994 | r | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 102 |

| 499994 | 599995 | gtdk | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 104 |

| 499995 | 599996 | njfb | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 100 |

| 499996 | 599997 | k | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 103 |

| 499997 | 599998 | abesz | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 108 |

| 499998 | 599999 | owpmo | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 106 |

| 499999 | 600000 | u | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 105 |

| 500000 | 600001 | btf | salesman | 1 | 2021-01-13 | 2000.00 | 400.00 | 104 |

±—±-------±------±---------±----±-----------±--------±-------±-------+

500000 rows in set (0.71 sec)

.

4、Show Profile


Show Profile 是什么?

  1. 是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量

  2. 官网:http://dev.mysql.com/doc/refman/5.5/en/show-profile.html

  3. 默认情况下,参数处于关闭状态,并保存最近15次的运行结果

分析步骤

查看是当前的SQL版本是否支持Show Profile

  • show variables like ‘profiling%’; 查看 Show Profile 是否开启

mysql> show variables like ‘profiling%’;

±-----------------------±------+

| Variable_name | Value |

±-----------------------±------+

| profiling | OFF |

| profiling_history_size | 15 |

±-----------------------±------+

2 rows in set (0.01 sec)


开启功能 Show Profile ,默认是关闭,使用前需要开启

  • set profiling=on; 开启 Show Profile

mysql> set profiling=on;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show variables like ‘profiling%’;

±-----------------------±------+

| Variable_name | Value |

±-----------------------±------+

| profiling | ON |

| profiling_history_size | 15 |

±-----------------------±------+

2 rows in set (0.00 sec)


运行SQL

  • 正常 SQL

select * from tbl_emp;

select * from tbl_emp e inner join tbl_dept d on e.deptId = d.id;

select * from tbl_emp e left join tbl_dept d on e.deptId = d.id;

  • 慢 SQL

select * from emp group by id%10 limit 150000;

select * from emp group by id%20 order by 150000 ;

select * from emp group by id%10 order by 5;


查看结果

  • 通过 show profiles; 指令查看结果

mysql> show profiles;

±---------±-----------±---------------------------------------------------------------------+

| Query_ID | Duration | Query |

±---------±-----------±---------------------------------------------------------------------+

| 1 | 0.00052700 | show variables like ‘profiling%’ |

| 2 | 0.00030300 | select * from tbl_emp |

| 3 | 0.00010650 | select * from tbl_emp e inner join tbl_dept d on e.‘deptId’ = d.‘id’ |

| 4 | 0.00031625 | select * from tbl_emp e inner join tbl_dept d on e.deptId = d.id |

| 5 | 0.00042100 | select * from tbl_emp e left join tbl_dept d on e.deptId = d.id |

| 6 | 0.38621875 | select * from emp group by id%20 limit 150000 |

| 7 | 0.00014900 | select * from emp group by id%20 order by 150000 |

| 8 | 0.38649000 | select * from emp group by id%20 order by 5 |

| 9 | 0.06782700 | select COUNT(*) from emp |

| 10 | 0.35434400 | select * from emp group by id%10 limit 150000 |

±---------±-----------±---------------------------------------------------------------------+

10 rows in set, 1 warning (0.00 sec)


诊断SQL

  • show profile cpu, block io for query SQL编号; 查看 SQL 语句执行的具体流程以及每个步骤花费的时间

mysql> show profile cpu, block io for query 2;

±---------------------±---------±---------±-----------±-------------±--------------+

| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |

±---------------------±---------±---------±-----------±-------------±--------------+

| starting | 0.000055 | 0.000000 | 0.000000 | 0 | 0 |

| checking permissions | 0.000007 | 0.000000 | 0.000000 | 0 | 0 |

| Opening tables | 0.000011 | 0.000000 | 0.000000 | 0 | 0 |

| init | 0.000024 | 0.000000 | 0.000000 | 0 | 0 |

| System lock | 0.000046 | 0.000000 | 0.000000 | 0 | 0 |

| optimizing | 0.000018 | 0.000000 | 0.000000 | 0 | 0 |

| statistics | 0.000008 | 0.000000 | 0.000000 | 0 | 0 |

| preparing | 0.000019 | 0.000000 | 0.000000 | 0 | 0 |

| executing | 0.000003 | 0.000000 | 0.000000 | 0 | 0 |

| Sending data | 0.000089 | 0.000000 | 0.000000 | 0 | 0 |

| end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 |

| query end | 0.000003 | 0.000000 | 0.000000 | 0 | 0 |

| closing tables | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |

| freeing items | 0.000006 | 0.000000 | 0.000000 | 0 | 0 |

| cleaning up | 0.000006 | 0.000000 | 0.000000 | 0 | 0 |

±---------------------±---------±---------±-----------±-------------±--------------+

15 rows in set, 1 warning (0.00 sec)

  • 参数备注:
  1. ALL:显示所有的开销信息

  2. BLOCK IO:显示块IO相关开销

  3. CONTEXT SWITCHES:上下文切换相关开销

  4. CPU:显示CPU相关开销信息

  5. IPC:显示发送和接收相关开销信息

  6. MEMORY:显示内存相关开销信息

  7. PAGE FAULTS:显示页面错误相关开销信息

  8. SOURCE:显示和Source_function,Source_file,Source_line相关的开销信息

  9. SWAPS:显示交换次数相关开销的信息


日常开发需要注意的结论

在表中如果出现以下:必须优化↓↓↓

  1. converting HEAP to MyISAM:查询结果太大,内存都不够用了往磁盘上搬了。

  2. Creating tmp table:创建临时表,mysql 先将拷贝数据到临时表,然后用完再将临时表删除

  3. Copying to tmp table on disk:把内存中临时表复制到磁盘,危险!!!

  4. locked:锁表


举例

下面是老师的例子

image-20200805143307302

这是我的:使用到了tmp表,但是打整条sql花了0.555,有0.552都在Sending data

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4jGz76d-1610598878309)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20210114114732542.png)]

.

5、全局查询日志


**永远不要在生产环境开启这个功能。**一般在测试环境下打开

配置启用全局查询日志

  • 在mysql的my.cnf中,设置如下:

开启

general_log=1

记录日志文件的路径

general_log_file=/path/logfile

输出格式

log_output=FILE

编码启用全局查询日志

  • 执行如下指令开启全局查询日志

set global general_log=1;

set global log_output=‘TABLE’;

  • 此后,你所执行的sql语句,将会记录到mysql库里的general_log表,可以用下面的命令查看

select * from mysql.general_log;

1

mysql> select * from mysql.general_log;

±--------------------±--------------------------±----------±----------±-------------±----------------------------------------------+

| event_time | user_host | thread_id | server_id | command_type | argument |

±--------------------±--------------------------±----------±----------±-------------±----------------------------------------------+

| 2020-08-05 14:41:07 | root[root] @ localhost [] | 14 | 0 | Query | select * from emp group by id%10 limit 150000 |

| 2020-08-05 14:41:12 | root[root] @ localhost [] | 14 | 0 | Query | select COUNT(*) from emp |

| 2020-08-05 14:41:30 | root[root] @ localhost [] | 14 | 0 | Query | select * from mysql.general_log |

±--------------------±--------------------------±----------±----------±-------------±----------------------------------------------+

3 rows in set (0.00 sec)

感谢尚硅谷!!!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
--------±----------------------------------------------+

3 rows in set (0.00 sec)

感谢尚硅谷!!!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-d80fVYCs-1711882240092)]
[外链图片转存中…(img-7m2EOlT6-1711882240092)]
[外链图片转存中…(img-Ka1I6PcU-1711882240093)]
[外链图片转存中…(img-Zuwe0E8o-1711882240093)]
[外链图片转存中…(img-Az5rmqMw-1711882240093)]
[外链图片转存中…(img-Gp8RQ7IW-1711882240094)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-VuObk64b-1711882240094)]

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

[外链图片转存中…(img-s6TnpxEF-1711882240094)]

[外链图片转存中…(img-xE1IzUmC-1711882240095)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值