我想比较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中存在更好的方式。
答案 0 :(得分:0)
在最好的情况下,函数pow
检测到指数是整数2并使用单个乘法执行取幂。没有理由它可以击败纯粹的倍数。