innuendo: Abfragen Optimieren

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

  1. 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

    1. 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