Ich verwende die folgende MySQL-Abfrage in einem PHP-Skript in einer Datenbank, die über 370.000.000 (ja, dreihundertsiebzig Millionen) Zeilen enthält. Ich weiß, dass es sehr ressourcenintensiv ist und es ewig dauert, diese eine Abfrage auszuführen. Weiß jemand, wie ich entweder die Abfrage optimieren kann oder die Informationen auf andere Weise schneller bekommen kann?Wie kann ich diese MySQL-Abfrage optimieren?
Tabelle Info:
games | longint, unsigned, Primary Key win | bit(1) loss | bit(1)
Abfrage:
SELECT MID(game
,{$len},1) ASmove
, COUNT(*) ASgames
, SUM(win
) ASwins
, SUM(loss
) ASlosses
FROMgames
WHEREgame
>{$something} ANDgame
<{$something_else} GROUP BYmove
Vielen Dank im Voraus für Ihre Hilfe!
Es ist sehr falsch, LIKE für einen numerischen Wert zu verwenden.Gleich für diese Gruppierung mit MID(), es klingt falsch. Warum machst du das? Schließlich, anstatt mehrere Spalten für "gewinnen" und "Verlust" warum nicht eine Spalte "Ergebnis", deren Wert könnte "gewinnen", "Verlust" oder "zeichnen". –
Es ist entweder ein LIKE oder größer als und kleiner als. Ich hätte nicht gedacht, dass es so oder so viel bewirken würde. Die Gruppierung nach MID() gruppiert grundsätzlich die nächste Ziffer in "Spiel". Wie MID (Spiel, 1, {$ len}). Die Gewinn/Verlust-Sache nimmt auf beiden Seiten 2 Bits Platz in Anspruch, also spielt es keine Rolle. – dampkwab
Bei der Verwendung von LIKE für numerische Werte ist Typ-Casting erforderlich, daher muss es weniger effizient sein. Was die Gewinn/Verlust-Spalten betrifft, fürchte ich, dass sie jeweils 1 Byte belegen, nicht nur 1 Bit. Für die Frage "warum" hätte ich vielleicht spezifischer sein sollen. Die wirkliche Frage ist, warum Sie nach Bereich suchen müssen, LIKE verwenden und das Ergebnis dann gruppieren, indem Sie die Textdarstellung einer Zahl verwenden. Ich weiß nicht, welche Daten Ihre "Spiele" Spalte tatsächlich hält (das ist wirklich die Art von Dingen, die Sie beschreiben sollten BTW), aber es scheint, dass Ihr Problem ist Ihre Datenbank-Design, nicht die ineffizienten Abfragen, die Sie haben. –