2011-05-23 44 views
16

我正在通过一些优化工作,并且我注意到在某些mysql转储文章和问题(我现在再也找不到我实际上正在查找的文章和帖子)中发布时,存在高精度执行时间( 0.05985215秒而不是0.06秒)。如何在mysql命令行中查看高精度查询时间?

如何在命令行上查看这些更精确的时间?

编辑

的这个例子是:

+----------+ 
| COUNT(*) | 
+----------+ 
| 11596 | 
+----------+ 
1 row in set (0.05894344 sec) 

使用分析得到了我的存在方式的一部分,而是产生一个输出太长了,我一定要记得启用它。我只是寻找一个简单的高精度持续时间。

SET profiling = 1; 
<query> 
SHOW PROFILES; 

给了我这样的事情:

+----------------------+-----------+ 
| Status    | Duration | 
+----------------------+-----------+ 
| (initialization)  | 0.000005 | 
| checking permissions | 0.00001 | 
| Opening tables  | 0.000499 | 
| Table lock   | 0.000071 | 
| preparing   | 0.000018 | 
| Creating tmp table | 0.00002 | 
| executing   | 0.000006 | 
| Copying to tmp table | 6.565327 | 
| Sorting result  | 0.000431 | 
| Sending data   | 0.006204 | 
| query end   | 0.000007 | 
| freeing items  | 0.000028 | 
| closing tables  | 0.000015 | 
| logging slow query | 0.000005 | 
+----------------------+-----------+ 
14 rows in set (0.00 sec) 
+0

心态后链接到包含高精度的执行时间(0.05985215秒而不是0.06秒)_的_articles和问题: 您可以通过施加反向补丁恢复到原来的二进制?我似乎无法找到任何。猜想回答你的问题的最快方法就是问这些文章的海报,并询问他们是如何做到的。 – 2011-05-25 12:48:44

+1

真正的问题是服务器是否支持它。分析将显示每个步骤所花费的CPU时间,不包括同时运行的**并发查询**。所以我们必须检查我们是否有一些** getrusage **没有分析。 – vbence 2011-05-25 15:15:30

回答

12

看来最好的答案是启用分析。没有其他的线索可以泛滥。

最佳答案,使用查询分析。

SET profiling = 1; 
<query> 
SHOW PROFILES; 
0

没有看到你所谈论的垃圾场,它可能是一个用户定义的函数?看到这个线程(http://lists.mysql.com/internals/33707)的几个陷阱和如何做到这一点。

+0

但是,这只会告诉您需要多少时间才能返回。就像你在程序中查询之前和之后保存microtime一样。换句话说,如果一个缓慢的查询运行在另一个线程上,它也会增加查询的运行时间。 - 一个真正的解决方案必须是基于** getrusage()**的,仅用于计算线程中运行的CPU时间(运行您的查询)。 – vbence 2011-05-25 14:36:42

10

这个问题最好通过查看source of the mysql command line client来解决。的relevant piece of code

static void nice_time(double sec,char *buff,bool part_second) 
{ 
    // ... 
    if (part_second) 
    sprintf(buff,"%.2f sec",sec); 
    else 
    sprintf(buff,"%d sec",(int) sec); 
} 

具有小数点的后的位数硬编码成()。这将使我得出结论,更高的精确时间是而不是可能与股票MySQL安装。

当然,您可以修补此代码,使其可配置等,并install from source。我想这是你提到的文章和问题中的人在做什么。找出最好的机会就是问问他们(请参阅我对你问题的评论)。

+0

@ax显然我只知道解决这个问题的第一部分。我设法增加了有效位数,但我认为结果在它被输入到这里之前在其他地方被截断。 – 2011-05-25 17:32:58

+0

@Ben Dauphinee你问过那些使用_高精度时间_他们是怎么做的?这应该比我更容易为你打补丁:) – 2011-05-25 21:18:21

+0

@ax我已经在MySQL论坛发布了一个线程,询问是否或如何做到这一点。当我得到它们时,我会交叉发布结果,并接受它在这个方向上的答案。 – 2011-05-25 21:23:48

0

不优雅,但工作的解决方案是修补/usr/bin/mysql

# copy the original mysql binary to your home dir 
cp /usr/bin/mysql ~/mysql 
# patch it 
sed -i -e 's/%.2f sec/%.8f sec/1' ~/mysql 
# run it from the home directory 
~/mysql 

它的工作原理,因为目前只有一个格式字符串在mysql二进制“.2f秒%”,但它可能会改变随着时间的推移。

sed -i -e 's/%.8f sec/%.2f sec/1' ~/mysql 
+1

对我来说,这是打印出像“设置2行(0.00000000秒)”的结果。但SHOW PROFILES表示这需要大约一毫秒的时间。所以我怀疑源数据提供这个分辨率不够高,这实际上有帮助。 – 2016-07-01 01:06:00