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)
通过一些正确的索引,这对于基本查询来说很快,但我无法想出一个在这么大的表上加速上述查询的好方法.
细节:
- 编辑 -
下面是问题的简化版本.
这在合理的时间内运行:
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?