MySQL之SQL性能(4)——查询截取分析(2)——批量插入数据脚本、show profile、全局查询日志

本文介绍了MySQL中批量插入数据的脚本方法,包括创建函数、存储过程以及调用存储过程进行数据插入。同时,详细解析了`show profile`功能,用于分析SQL执行的资源消耗,并强调了在查询分析中需要注意的四个危险状态。最后,讨论了全局查询日志的配置启用及其在测试环境的应用。
摘要由CSDN通过智能技术生成

目录

1.批量插入数据脚本

2.show profile

(1)是什么

(2)分析步骤

3.全局查询日志

(1)配置启用

(2)编码启用


1.批量插入数据脚本

往表里插200万的数据

(1)建表

 CREATE TABLE dept(
	id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 	
	deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, #部门编号
	dname VARCHAR(20) NOT NULL DEFAULT "",#部门名字
	loc VARCHAR(13) NOT NULL DEFAULT "" #部门位置
 )ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE dept(
	id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	emptno 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;

设置参数log_bin_trust_function_creators

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

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

永久修改,如下,修改配置文件中/etc/my.cnf,添加如下

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

函数1:随机返回字符串

 DELIMITER $
 CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
 BEGIN
	DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	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 $

函数2:随机返回部门编号

 CREATE FUNCTION rand_num() RETURNS INT(5)
 BEGIN
	DECLARE i INT DEFAULT 0;
	SET i=FLOOR(100+RAND()*10);
	RETURN i;
 END $

创建存储过程

存储过程1:往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,hirdate,sal,comm,deptno)
 VALUES(START+i,rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
 UNTIL i =max_num
 END REPEAT;
 COMMIT;
 END $

 

存储过程2:往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条记录

向emp表中插入200 0000条记录

此处根据根据个人电脑的性能的差别会执行很长时间

2.show profile

(1)是什么

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

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

(2)分析步骤

1)查看当前的mysql版本是否支持

show variables like 'profiling';

2)开启profiling

3)运行SQL

下面的一句执行3次

 

.......

......

4)使用show profiles;查看执行过的SQL

可以看到各个sql语句的执行时间情况

5)诊断SQL

show profile cpu,block io for query 上一步前面问题SQL数字号码;

示例

诊断上述查询语句3:select * from class inner join book on class.card=book.card;

此处由于我之前查询过,所以此处直接在缓存上找到了结果返回

诊断上述查询语句8:select * from emp group by id%10 limit 1500000;

可以看到使用上述show profile命令可以查看到一条查询语句执行的完整的生命周期

其实不只可以查看cpu和block io,可以查看的参数类型如下:

5)对于show profile的结果分析

以下4个状态是危险的4个状态:

  • convertion HEAP to MyISAM:查询结果太大,内存都不够用了往磁盘上搬
  • Creating tmp table:创建临时表,拷贝临时表,用完再删除临时表
  • Copying to tmp table on disk:把内存中临时表复制到磁盘,危险!!!
  • locked

只要你写的SQL中出现上述4个状态中的任何一个,这条SQL必须得优化

 

3.全局查询日志

全局查询日志只允许在测试环境用,永远不要在生产环境开启这个功能

(1)配置启用

在/etc/my.cnf配置文件中,设置如下:

//开启
general_log=1

//记录日志文件的路径
general_log_file=/path/logfile

//输出格式
log_output=FILE

(2)编码启用

//开启
set global general_log=1;


//输出格式
set global log_output='TABLE';

此后,你所编写的所有SQL语句,将会记录在mysql库里的general_log表,可以用以下命令查看:

select * from mysql.general_log;

以下是我执行了一些语句后的示例:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值