如何解决我如何在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。