如何优化MASSIVE MySQL表上计算列的ORDER BY

cbr*_*lle 13 mysql sql-order-by query-optimization

我有一个非常大(超过80万行)的非规范化MySQL表.简化的架构如下所示:

+-----------+-------------+--------------+--------------+
|    ID     |   PARAM1    |   PARAM2     |   PARAM3     |
+-----------+-------------+--------------+--------------+
|    1      |   .04       |    .87       |    .78       |
+-----------+-------------+--------------+--------------+
|    2      |   .12       |    .02       |    .76       |
+-----------+-------------+--------------+--------------+
|    3      |   .24       |    .92       |    .23       |
+-----------+-------------+--------------+--------------+
|    4      |   .65       |    .12       |    .01       |
+-----------+-------------+--------------+--------------+
|    5      |   .98       |    .45       |    .65       |
+-----------+-------------+--------------+--------------+

我试图看看是否有一种优化查询的方法,其中我将权重应用于每个PARAM列(权重在0和1之间),然后将它们平均得出计算值SCORE.然后我想ORDER BY计算出的SCORE列.

例如,假设PARAM1的权重为.5,PARAM2的权重为.23,PARAM3的权重为.76,您最终会得到类似于:

SELECT ID, ((PARAM1 * .5) + (PARAM2 * .23) + (PARAM3 * .76)) / 3 AS SCORE 

ORDER BY SCORE DESC LIMIT 10
Run Code Online (Sandbox Code Playgroud)

通过一些正确的索引,这对于基本查询来说很快,但我无法想出一个在这么大的表上加速上述查询的好方法.

细节:

  • 每个PARAM值介于0和1之间
  • 应用于PARAMS的每个重量在0到1秒之间

- 编辑 -

下面是问题的简化版本.

这在合理的时间内运行:

SELECT value1, value2 
FROM sometable 
WHERE id = 1 
ORDER BY value2
Run Code Online (Sandbox Code Playgroud)

这并没有在合理时间内运行:

 SELECT value1, (value2 * an_arbitrary_float) as value3 
 FROM sometable 
 WHERE id = 1 
 ORDER BY value3
Run Code Online (Sandbox Code Playgroud)

使用上面的例子,是否有任何解决方案允许我提前进行ORDER BY计算值3?

Álv*_*lez 0

MySQL 缺乏许多可以帮助您解决此问题的性感功能。也许您可以添加一个包含计算排名的列,为其建立索引并编写几个触发器以使其保持更新。