XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Meine Queries optimieren (http://xhtmlforum.de/showthread.php?t=39154)

insanic! 14.03.2006 18:26

Meine Queries optimieren
 
Hallo,

meine Seite lädt zwar sehr schnell, aber da meine Besucherzahlen wachsen, möchte ich dementsprechend auch meine Seite optimieren.

Nur ehrlichgesagt weiß ich garnicht, wie das geht :/

Ich weiß nicht, wie man Indexe am Besten vergibt, auch wenn ich das Manual schon gelesen habe.

Ich kenne Explain SQLCode, aber das Ergebnis, das ich in PHPmyAdmin bekomme, sagt mir nichts (auch nachdem ich mir das durchgelesen habe) ...

Könnt Ihr mir eventuell helfen, meine Queries bzw meine Tabellen zu optimieren?

Wäre echt toll, Danke!

p.s.: Ich könnte ja einfach ein Paar Screenshots von Query + Ergebnis von Explain+Query posten!?

Nr1:

http://img1.myimg.de/Zwischenablage027f4.jpg

The Doc 14.03.2006 18:33

Edit: Grad nochmal deine Query angeguckt, die ist wirklich grauenhaft, aber weniger wegen den Indizes!
Benutz mal Joins, afaik ist das weit schneller.

Grundsätzlich versuchen, dass jedes Element, was du in Joins oder Where verwendest ein Index ist. Und ich wüsste nicht, was man mehr wissen muss, als hier beschrieben:

http://dev.mysql.com/doc/refman/4.1/en/explain.html

Solltest halt Folgendes überlegen:
Wird das Feld in einem Join / Where benutzt?
--> z.B. ID's (sind aber schon Primary und damit schon ein Index)
--> Date / Timestamp etc.
--> varchar / int

Aber überlegen, ob der Index sinn macht, wenn die Query selten ist bringt es nicht viel ein Index aufzubauen und damit unnötig Speicher zu verschwenden.

insanic! 14.03.2006 18:43

Wie viel Speicher verbraucht ein Index ca? Verlangsamt es die DB, wenn man unnötige Indizes setzt?

The Doc 14.03.2006 18:45

Ob es sie verlangsamt kann ich nicht sagen, aber jeder Index belegt auf dem Server speicherplatz - und alles was unnötig ist, sollte man prinzipiell lassen!

Überleg dir also, wo du ein Index setzt, mach nicht überall einfach ein Index, weil du denkst, dass das mal irgendwann gebraucht werden könnte...

Jan 14.03.2006 19:53

Hallo!

Ich würde versuchen die GROUP-Klausel aus der Abfrage zu bekommen. Die verbraucht meist sehr viel Kapazitäten.

Du könntest z.B. die Zahlen der Votes und die Summe der Bewertung mit in der link_entries speichern. So brauchst du diese Zahlen nicht bei jedem Abruf neu berechnen.

Dennoch würde ich jede Stimme zusätzlich, wie du das jetzt auch schon machst, in einer getrennten Tabelle speichern, um später vielleicht anderen Statistiken generieren zu können.

Unnötige Indizes verbrauchen nur Speicherplatz. Dennoch verbrauchen Sie auch Rechenleistung, wenn Änderungen an den Tabellen vorgenommen werden. Deshalb macht es z.B. keinen Sinn einen Index einzurichten, der nur einmal die Woche benötigt wird, wenn pro Tag mehrere Änderungen an der Tabelle vollzogen werden.

Hier die Erklärung der EXPLAIN Ausgabe: http://www.xhtmlforum.de/viewtopic.php?p=29362#29362

Gruß
Jan

insanic! 14.03.2006 21:24

Danke euch beiden.

@Jan: So eine ähnliche Erkläreung für EXPLAIN habe ich schon gelesen, jedoch nützt Sie mir nicht viel. Ich werd daraus nicht schlau, denn ich weiß nicht, was ich dann zu machen habe, um z.b. bei "type" von "ALL" wegzukommen ...[/url]

The Doc 14.03.2006 21:43

Ein Index setzen...

insanic! 14.03.2006 22:58

Zitat:

Zitat von The Doc
Ein Index setzen...

eben nicht :(
mein query:

Code:


EXPLAIN
SELECT
                        e.id,
                        c.name,
                        c.name as cat_name,
                        c.id as catid,
                        e.freigeschaltet,
                        e.beschreibung,
                        e.poster,
                        e.poster_hp,
                        e.hits,
                        (sum(v.vote)/count(v.vote)) as roundedRating
FROM
                        link_entries e,
                        link_cats c,
                        link_voting v
WHERE
                                c.id = e.cat_id
                        AND c.id = "3"
                        AND v.link_id = e.id
                        AND flag = "1"
                        AND freigeschaltet < 1142353931
GROUP BY
                        e.id
ORDER BY
                        freigeschaltet desc
LIMIT                0, 30

habe eigentlich überall auf c.id, v.link_id, e.cat_id indexe ... das ergebnis:

http://img1.myimg.de/Zwischenablage020b5.jpg

Kann man da noch was verbesserung, außer nen gescheiten join anstatt dem pseuo.where.join zu nutzten? :)

derHund 15.03.2006 01:32

ich würds wirklich erstmal mit JOINs versuchen, außerdem die " um zahlen weglassen.

insanic! 15.03.2006 08:31

ich habe das Gefühl, ich sei zu blöd :(

Habe nun viel rumprobiert. Er PHPMyAdmin meckert immer bei folgendem Query:

Code:

EXPLAIN
SELECT
                        e.id,
                        c.name,
                        c.name as cat_name,
                        c.id as catid,
                        e.freigeschaltet,
                        e.beschreibung,
                        e.poster,
                        e.poster_hp,
                        e.hits,
                        (sum(v.vote)/count(v.vote)) as roundedRating
FROM
                        link_entries e,
               
JOIN link_cats AS c
                        ON e.cat_id = c.id
                        WHERE  c.id = 3

JOIN link_voting AS v
                        ON e.id = v.link_id

WHERE       
                        e.flag = 1
                AND e.freigeschaltet < 1142353931       
               
GROUP BY
                        e.id
ORDER BY
                        freigeschaltet desc
LIMIT   
                        0, 30

Fehler:

Code:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN link_cats AS c
    ON e.cat_id = c.id

JOIN link_voting AS v
    ON e.id =' at line 15

Warum?`:(


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:30 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023