DB-Optimierung mit MySQL - 'group by'-alternative?

Hallo,

ich habe eine relative große mysql-db mit ca 1.5 mio datensätzen und habe in meiner applikation (mit php) eine ganze reihe von variablen sql-abfragen, die je nach auswahl des benutzers mit parametern gefüllt werden. hierbei sind - abhängig von der auswahl eines benutzers in den entsprechenden dropdown-menüs - mehrere tausend kombination von beteiligten spalten aus der db möglich. der benutzer hat ein interface in dem er über 10 dropdown-menüs je einen wert auswhählen - aber nicht muss! in den dropdown-menüs hat er zwischen 5 und 70 mögliche werte. deswegen lassen sich die kombinationen für die abfragen schwer vorher sagen und somit bringt es mir auch nichts views für eventuelle db-abfragen zu erstellen. im moment dauern abfragen ewig - wenn überhaupt mal etwas zurückkommt…in jeder abfrage verwende ich group-by, weswegen mir scheint, dass das eine mögliche ursache für die miserable performance sein könnte. im moment besteht die db nur aus einer tabelle, in der alle attribute drinstehen, so dass schonmal keine joins zwischen tabellen nötig sind. eine typische abfrage sieht so aus:
$Query = "select text, count(*) as anzahl from general where

sex=’$gender’ group by text order by anzahl desc limit 5";

oder auch so:

$Query = „select text, count(*) as anzahl from general where sex=’$gender’ AND age between ‚$age‘ and (’$age’+10) AND country=’$cntry’ AND familystatus=’$familystatus’ AND bodytype=’$bodytype’ AND ethnicity=’$ethnicity’ AND religion=’$religion’ AND education=’$education’ AND income=’$income’ AND sexualorientation=’$sexualorientation’ group by text order by anzahl desc limit 5“;

es wäre sehr schön für mich wenn es eine einfache antwort auf die frage gäbe was eine alternative zu „group by“ ist, die performanter arbeitet :smile: aber vermutlich ist die antwort nicht so einfach…

ich wäre froh um den ein oder anderen grundlegenden tipp oder nützlichen link zur möglichen optimierung - meine db liefert sicher ausreichend genug potenzial :smile:

danke
sebastian

Hallo Sebastian,

viele Chancen auf eine vernünftige Aussage wirst Du nicht haben, da
a) Erstens benötigt eine Aggregationfunktion wie count immer eine group by Klausel.
b) Zweitens erzählst Du wenig darüber, wie häufig die Daten einen Update erfahren. Wenn nur wenige Updates kommen, kann man entsprechende Aggregationstabellen (mit den häufigsten Gruppierungen) anlegen.
c) Einige Attribute scheinen ja kaum Einschränkungen zu haben, aber Du erzählst nicht, wieviele Ausprägungen das Attribut text haben kann (also wieviele Zeilen herauskommen, wenn man keine Einschränkung angibt).
d) Die Dauer kommt davon, dass erstmal alle 1,5 Millionen Zeilen gelesen und sortiert müssen (siehe auch Frage c) werden. Also gibt es eigentlich nur zwei Strategien: Reduziere den Platzbedarf oder sortiere „extern“.

MfG Georg V.

Hi!

Zusätzlich würde ich noch nach das Stichwort „Index“ in den Raum schmeißen.

Grüße,
Tomh

PS: 1,5 Mio. Datensätze sollten eigentlich durchflutschen - auch bei dynamischen Statements.