Wie optimiere ich ein ORDER BY für eine berechnete Spalte in einer MASSIVE MySQL-Tabelle?

Ich habe eine sehr große (über 80 Millionen Zeilen) de-normalisierte MySQL-Tabelle. Ein vereinfachtes Schema sieht wie folgt aus:

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

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, eine Abfrage zu optimieren, bei der ich jeder PARAM-Spalte eine Gewichtung zuordnet (wobei die Gewichtung zwischen 0 und 1 liegt) und sie dann mittelt, um einen berechneten Wert SCORE zu erhalten. Dann möchte ich NACH dieser berechneten SCORE-Spalte ordnen.

Angenommen, die Gewichtung für PARAM1 ist .5, die Gewichtung für PARAM2 ist .23 und die Gewichtung für PARAM3 ist .76, dann erhalten Sie etwas Ähnliches wie:

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

ORDER BY SCORE DESC LIMIT 10

With einige richtige Indizierung, ist dies schnell für grundlegende Abfragen, aber ich kann keinen guten Weg finden, um die obige Abfrage auf einer so großen Tabelle zu beschleunigen.

Einzelheiten

Jeder PARAM-Wert liegt zwischen 0 und 1Jedes auf die PARAMS angewendete Gewicht liegt zwischen 0 und 1 s

--BEARBEITEN-

Eine vereinfachte Version des Problems folgt.

Dies läuft in angemessener Zeit:

SELECT value1, value2 
FROM sometable 
WHERE id = 1 
ORDER BY value2

Das machtnich in angemessener Zeit ausführen:

 SELECT value1, (value2 * an_arbitrary_float) as value3 
 FROM sometable 
 WHERE id = 1 
 ORDER BY value3

Gibt es im obigen Beispiel eine Lösung, mit der ich ein ORDER BY ausführen kann, ohne vorher den Wert3 zu berechnen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage