我如何在mysql命令行中看到高精度查询时间?

| 我正在做一些优化工作,并且我注意到在某些MySQL转储中,人们发表在文章和问题中(实际上我现在再也找不到了),执行时间非常精确(0.05985215秒而不是0.06秒)。 如何在命令行中查询这些更精确的时间? 编辑 例如:
+----------+
| 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)
    
已邀请:
似乎最好的答案是启用概要分析。没有其他线索可以提出。 最佳答案,请使用查询分析。
SET profiling = 1;
<query>
SHOW PROFILES;
    
通过查看mysql命令行客户端的源代码,可以最好地回答此问题。相关的代码段,
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);
}
将sec值硬编码为(2)的小数点后的位数。这将使我得出结论,使用现有的mysql安装无法实现更高的精度。 当然,您可以修补此代码,使其可配置等,然后从源代码安装。我想这就是您提到的文章和问题中的人正在做的事情。找出答案的最佳机会就是问他们(请参阅我对您问题的评论)。     
没有看到您正在谈论的转储,它可能是用户定义的功能?请参阅此线程(http://lists.mysql.com/internals/33707),以获取一些陷阱以及如何做。     
不是很优雅,但是可行的解决方案是修补
/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 sec \',但是它可能会随着时间而改变。 您可以通过应用反向补丁恢复为原始二进制文件:
sed -i -e \'s/%.8f sec/%.2f sec/1\' ~/mysql
    

要回复问题请先登录注册