Abfragen Optimieren
innuendo
- datenbank
Hallo,
ich habe von meinem Provider eine auf den Rüssel bekommen, weil meine Abfragen zu lange dauern. Jetzt möchte ich diese optimieren und hätte gerne ein paar Tipps von Profis bekommen.
Die Tabelle selbst hat ca. 400.000 Einträge (MySQL) und ist so aufgebaut:
ID int(10) auto_increment (Primary Key)
Content varchar(150) BINARY
project int(10)
Ich habe jetzt Abfragen wie zB:
select *,content from mytable
where
project = $project_id
order by rand() limit 10
Davon ca. 3-4 Stück auf einer Seite. Pro Project würde ich sagen gibt es max. 100.000 Ergebnisse.
Was kann ich optimieren, wo kann ich den Hebel ansetzen, damit ich keine mehr auf den Rüssel bekomme, ohne dass ich meine Table auseinanderreiße? Sind die Abfragen "schlecht"?
Fragen über Fragen... danke schon mal für eure Tipps.
lg,
Innuendo
Halihallo innuendo
ich habe von meinem Provider eine auf den Rüssel bekommen, weil meine Abfragen zu lange dauern. Jetzt möchte ich diese optimieren und hätte gerne ein paar Tipps von Profis bekommen.
Informiere dich über Indizies (Index) und deine Sorgen sind
Geschichte (soweit ich sie jetzt übersehen kann ;)).
ID int(10) auto_increment (Primary Key)
Content varchar(150) BINARY
project int(10)
http://www.mysql.com/doc/en/MySQL_indexes.html
http://www.mysql.com/doc/en/CREATE_TABLE.html
select *,content from mytable
Das "content" ist überflüssig, wenn du eh alle Attribute selektierst.
Brauchst du wirklich alle Attribute?
where
project = $project_id
order by rand() limit 10
Ein Index über project bringt einen starken Performance-Schub.
Davon ca. 3-4 Stück auf einer Seite. Pro Project würde ich sagen gibt es max. 100.000 Ergebnisse.
Spielt keine Rolle. ORDER BY RAND() LIMIT 10 wird vom QueryOptimizer
verbessert.
Was kann ich optimieren, wo kann ich den Hebel ansetzen, damit ich keine mehr auf den Rüssel bekomme, ohne dass ich meine Table auseinanderreiße? Sind die Abfragen "schlecht"?
Die Abfragen nicht umbedingt, aber die Tabellendefinition. Sprich:
die fehlenden Indizies. Das ist böse[tm].
Viele Grüsse
Philipp
yo,
vielleicht noch als ergänzung zu sagen, dass du nun nicht wie wild anfängst indizes zu bilden, sondern nur über die von philip vorgeschlagene spalte projekt. setzen von indizes erhöhen zwar die abfrage, aber verlangsamen das einfügen, löschen und editieren von datensätze, da der index dabei mit berüchksichtig werden muss. deswegen bildet man in aller regel einen index über spalten, die in der WHERE klausel stehen.
und * sollte man auch nur zu testzwecken verwenden, wie philip schon angesprochen hat. also immer die spaltennamen angeben, auch wenn du alle spalten benötigst.
Ilja