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

Posted

技术标签:

【中文标题】如何比较 MySQL 中两个函数的平均运行时间?【英文标题】:How do I compare average runtime of two functions in MySQL? 【发布时间】:2014-11-08 07:40:36 【问题描述】:

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

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

点积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 中是否存在更好的方法。

【问题讨论】:

也许你可以创建一张表A,只有一列名为c,并插入50,000,000条记录,然后选择rand()*rand()+rand()*rand()+rand() *rand() as c0, A.c from A;此选择将计算 50,00,000 次,也许会对您有所帮助。 @coo 我已经编辑了我的问题 不方便。只需一个简短的程序,插入一个循环。您无需手动插入。 你不是在分析你的距离函数,你是在分析 rand !比较计算不同事物的表达式真的有意义吗? @YvesDaoust 比较它们确实有意义,因为地球上的两个点(球体)最小平方距离相当于最大化点积,它们之间距离为 0 的 2 个点具有最大点积 R *R。所以,我有一个选择,关于如何进行查询...... 【参考方案1】:

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

【讨论】:

如果您的应用程序是计算密集型的,您最好寻找一种具有更好渐近复杂度的算法。 我尝试了 coo 的建议,是的,点积平均要快 1.4 倍...但是,创建一个完整的表并在每次你想计时的时候用随机数填充它是不方便的一个不同的功能......似乎没有其他办法...... 尝试切换到渐近复杂度较低的算法。

以上是关于如何比较 MySQL 中两个函数的平均运行时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 8 中使用两个变量进行滚动平均?

MySQL--如何快速对比数据

MySQL中两个日期字段之间的平均时间?

MySQL:比较两个转换函数的结果

WGCLOUD和ZABBIX两个运维软件如何选型

日常运维1wvmstat