如何比较MySQL中两个函数的平均运行时间?

时间:2014-11-08 07:40:36

标签: mysql optimization profiling query-optimization

我想比较MySQL中两个函数的平均运行时间 -

方距pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2)

VS

点数产品x1 * x2 + y1 * y2 + z1 * z2

现在,我选择的任何一个函数都会在一次查询中运行 50,000,000,000次!所以,即使是最简单的运行时间差异也很重要。

所以,我尝试了剖析。这就是我得到的,

mysql> show profiles;
+----------+------------+-----------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                 |
+----------+------------+-----------------------------------------------------------------------+
|        4 | 0.00014400 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        5 | 0.00012800 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        6 | 0.00017000 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        7 | 0.00024800 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        8 | 0.00014400 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|        9 | 0.00014000 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|       10 | 0.00014900 | select pow(rand()-rand(),2)+pow(rand()-rand(),2)+pow(rand()-rand(),2) |
|       11 | 0.00015000 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       12 | 0.00012000 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       13 | 0.00015200 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       14 | 0.00022500 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       15 | 0.00012700 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       16 | 0.00013200 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       17 | 0.00013400 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
|       18 | 0.00013800 | select rand()*rand()+rand()*rand()+rand()*rand()                      |
+----------+------------+-----------------------------------------------------------------------+
15 rows in set, 1 warning (0.00 sec)

这根本不是很有用,运行时间波动很大,我不知道哪一个更快,多少。

我需要运行10,000次这样的每个函数才能获得一个漂亮且一致的平均运行时间。我如何在MySQL中实现这一目标?

(注意rand()在两个函数中被调用了6次,因此它的运行时并没有真正产生影响)

修改

当然,我可以创建一个临时表,稍微不方便,用随机值填充它,这也不是直接的(参见How do I populate a mysql table with many random numbers),然后继续比较我的函数。

我想知道如果MySQL中存在更好的方式。

1 个答案:

答案 0 :(得分:0)

在最好的情况下,函数pow检测到指数是整数2并使用单个乘法执行取幂。没有理由它可以击败纯粹的倍数。