CREATE PROCEDURE `testtime`() begin DROP TABLE IF EXISTS TEMP_COUNT; CREATE TABLE TEMP_COUNT( ID_COUNT int (10) AUTO_INCREMENT, I_SEC INT (10), CUR_TIME DATE, PRIMARY KEY (ID_COUNT) )ENGINE=INNODB DEFAULT CHARSET=utf8;set @a=now(); SELECT * FROM TB_COMPANY; SET @tmp=HOUR(timediff(now(),@a))*3600+ MINUTE(timediff(now(),@a))*60 +SECOND(timediff(now(),@a)); INSERT into TEMP_COUNT(I_SEC) VALUES(@tmp); set @a=now(); SELECT * FROM TB_COST_REVENUE; SET @tmp=HOUR(timediff(now(),@a))*3600+ MINUTE(timediff(now(),@a))*60 +SECOND(timediff(now(),@a)); INSERT into TEMP_COUNT(I_SEC) VALUES(@tmp);SELECT * from TEMP_COUNT; end 我写了一个简单的sp 这样是可以计算出一个sql的时间 但是如果在生产环境 数据量大 sql 多的话 就不太好用 有没有什么好的办法统计呢
然后两次时间相减
begin
DROP TABLE IF EXISTS TEMP_COUNT;
CREATE TABLE TEMP_COUNT(
ID_COUNT int (10) AUTO_INCREMENT,
I_SEC INT (10),
CUR_TIME DATE,
PRIMARY KEY (ID_COUNT)
)ENGINE=INNODB DEFAULT CHARSET=utf8;set @a=now();
SELECT * FROM TB_COMPANY;
SET @tmp=HOUR(timediff(now(),@a))*3600+ MINUTE(timediff(now(),@a))*60 +SECOND(timediff(now(),@a));
INSERT into TEMP_COUNT(I_SEC) VALUES(@tmp);
set @a=now();
SELECT * FROM TB_COST_REVENUE;
SET @tmp=HOUR(timediff(now(),@a))*3600+ MINUTE(timediff(now(),@a))*60 +SECOND(timediff(now(),@a));
INSERT into TEMP_COUNT(I_SEC) VALUES(@tmp);SELECT * from TEMP_COUNT;
end
我写了一个简单的sp
这样是可以计算出一个sql的时间
但是如果在生产环境 数据量大 sql 多的话 就不太好用
有没有什么好的办法统计呢
Query Profiler 是mysql的诊断分析工具,通过该工具一条 Query 在整个执行过程中 CPU,IO这些资源的消耗情况
比如 :
mysql> show profile cpu,block io for query 3;
+--------------------+----------+----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------+----------+----------+------------+--------------+---------------+
| starting | 0.000552 | 0.000000 | 0.000000 | 0 | 0 |
| Opening tables | 0.000195 | 0.000000 | 0.000000 | 0 | 0 |
| System lock | 0.000068 | 0.000000 | 0.000000 | 0 | 0 |
| Table lock | 0.000057 | 0.000000 | 0.000000 | 0 | 0 |
| init | 0.000206 | 0.000000 | 0.000000 | 0 | 0 |
| optimizing | 0.000022 | 0.000000 | 0.000000 | 0 | 0 |
| statistics | 0.000101 | 0.000000 | 0.000000 | 0 | 0 |
| preparing | 0.000041 | 0.000000 | 0.000000 | 0 | 0 |
| executing | 0.000006 | 0.000000 | 0.000000 | 0 | 0 |
| Sending data | 0.000502 | 0.000000 | 0.000000 | 0 | 0 |
| end | 0.000023 | 0.000000 | 0.000000 | 0 | 0 |
| query end | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |
| freeing items | 0.000077 | 0.000000 | 0.000000 | 0 | 0 |
| logging slow query | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |
| cleaning up | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |
+--------------------+----------+----------+------------+--------------+---------------+
15 rows in set (0.00 sec)得不到sql的执行时间.
测试环境还可以 但是生产环境是不行的
生产环境的所有server的slow query设置都会通过outlook发邮件 每天都有很多的DML DDL语句执行 那邮件会爆满的啊...