我有一张非常大(8000万+行)的MySQL表格,已经过去规范化。简化的结构如下:
例如,假设PARAM1的权重为.5,PARAM2的权重为.23,PARAM3的权重为.76,则会得到类似以下内容:
+-----------+-------------+--------------+--------------+ | 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。 然后我想按计算出的SCORE列进行排序。
例如,假设PARAM1的权重为.5,PARAM2的权重为.23,PARAM3的权重为.76,则会得到类似以下内容:
SELECT ID, ((PARAM1 * .5) + (PARAM2 * .23) + (PARAM3 * .76)) / 3 AS SCORE
ORDER BY SCORE DESC LIMIT 10
通过适当的索引,基本查询可以快速完成,但我无法想出一个好的方法来加快对如此大的表格进行上述查询。
细节:
- 每个PARAM值介于0和1之间
- 应用于PARAMS的每个权重都介于0和1 s之间
--编辑--
问题的简化版本如下。
这个运行速度比较合理:
SELECT value1, value2
FROM sometable
WHERE id = 1
ORDER BY value2
这段代码在合理的时间内无法运行:
SELECT value1, (value2 * an_arbitrary_float) as value3
FROM sometable
WHERE id = 1
ORDER BY value3
使用上面的例子,是否有任何解决方案可以让我在不提前计算value3的情况下进行ORDER BY?
<code>
标签不被识别。我已经为您完成了。 - Álvaro González