XHTMLforum

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

insanic! 13.04.2006 22:18

Queries und Performance
 
Hi,

habe mal wieder ne Frage zu 2 Queries, die langsam sind: Wie man diese verbessern kann!

1. Query:
Code:

SELECT               
                        /*** AUS DER TABELLE OWN_CONTENT ***/
                        o.id                                        AS oid,
                        o.time                                        AS otime,
                        o.disNaviReferer                AS showR,
                        o.disNaviToplist                AS showT,
                        o.disNaviPartner                AS showP,
                        o.type,
                        o.used,
                       
                        /*** AUS DER TABELLE LINK_CATS ***/
                        c.id                                        AS cid,
                        c.name                                        AS catname,
                       
                        /*** AUS DER TABELLE LINK_ENTRIES ***/
                        e.id                                        AS eid,
                        e.beschreibung                        AS linkdesc,
                        e.flag,
                        e.freigeschaltet                AS etime,
                        e.previewPic                        AS prev,
                        e.hits
FROM
                        own_content o
LEFT JOIN
                        link_entries e
                                ON e.link = o.id
LEFT JOIN
                        link_cats c
                                ON c.id = e.cat_id
ORDER BY
                        oid desc
LIMIT                0, 20

Wenn ich diesen per Explain in PhpMyAdmin ausführe, bekomme ich folgende Ausgabe:
http://img1.myimg.de/q1ef7_thumb.jpg

Indizes sind gesetzt auf:
- link-cats: id
- link_entries: id, cat_id, freigeschaltet, flag
- own_content: id

Teilweise kommen noch ein paar Where-Klauseln dazu (aber der Query so wie er da steht ist schon lahm).




2. Query:
Code:

SELECT                count(o.id) AS anz
FROM                own_content o
LEFT JOIN        link_entries e
                        ON e.link = o.id
LEFT JOIN        link_cats c
                        ON c.id = e.cat_id

Selben Indizes.
Wenn ihr mich hier nun fragt, warum ich die LeftJoins drin habe, wenn ich doch eh nur o.id zählen will: Weil ich teilweise eine Where-Klausel nutzte, in der ich c.id und e.flag benötige!

Was kann ich nun verbessern?

Danke!!

The Doc 13.04.2006 22:26

1. : link_entries: link

2. : wenn du nur manchmal Where benutzt, dann benutzt auch nur manchmal die längere Query, is doch logisch...

insanic! 13.04.2006 22:39

2. hab ich grad gemacht ;)
Hab einfach beim 2. Query die LeftJoins nur dann gesetzt, falls WHERE genutzt wird ;)

zum Index: danke, versuch ich mal ;)

insanic! 13.04.2006 22:42

hm, der Index hat mir nichts gebracht:
http://img1.myimg.de/2q39d_thumb.jpg

Jan 14.04.2006 00:04

Hi!

Ich glaube bald, dass man dort nicht viel machen kann. Es müssen ja alle Zeilen ausgelesen werden. Eine andere Alternative gibt es nicht. Anders würde die Sache aussehen, wenn du eine WHERE-Klausel einfügst. Oder denke ich da jetzt völlig verkehrt?

Vielleicht hilft es auch in diesem Fall, den großen Join in kleinere effiziente Teile aufzusplitten.

Gruß
Jan

The Doc 14.04.2006 00:33

hmm, aber imho müsste doch bei
Code:

LEFT JOIN
        link_entries e
            ON e.link = o.id

mit e.link als Index was besseres als ALL zustande kommen, oder?

insanic! 14.04.2006 00:38

@thedoc: ja, dachte ich eigentlich auch

@jan: hm, naja, weiß nicht genau, wie man das in kleinere teile aufsplitten soll. aber da es "nur" für ein adminmenü ist, ist das eventuell den aufwand nicht wert...

insanic! 14.04.2006 13:22

in einem Forum habe ich noch einen Hinweis auf die Funktion SQL_CALC_FOUND_ROWS gefunden! Habe mal bei Google danach gesucht:

http://news.php-homepage.de/archives...OUND_ROWS.html

http://dev.mysql.com/doc/refman/4.1/...functions.html unter dem Punkt 'Found rows'

Eventuell werde ich das mal ausprobieren ;)

Edit: 5 Kommentar von oben auf http://php3.de/mysql-num-rows besagt:
Code:

I find that mysql_num_rows() overlook LIMIT clauses.
For instance:

//table has 700 rows
$command = "SELECT * FROM table LIMIT 500";
$q = mysql_query($command);
$rows = mysql_num_rows($q);

//$rows is 700

Das ist dann wahrscheinlich das, was ich brauche, oder? :)

Jan 14.04.2006 16:30

Hi!

Zitat:

Zitat von insanic
@jan: hm, naja, weiß nicht genau, wie man das in kleinere teile aufsplitten soll. aber da es "nur" für ein adminmenü ist, ist das eventuell den aufwand nicht wert...

Stimmt, das lohnt sich wirklich nicht. Was passiert den bei LIMIT 0,500?

Was mir gerade noch einfällt. Hast du den Query vielleicht schonmal in einen inner Join umgeschrieben?

Gruß
Jan

insanic! 14.04.2006 20:00

@Jan: Warum Limit 0, 500? Dann habe ich doch auch nicht alle Datensätze per count() oder? Inner Join, was genau ist das? :) Bzw wenn ich einen LEFT JOIN nutzte, darf ich dann einfach einen Inner Join draus machen?

Ich habe nun mal das mit dem SQL_CALC_FOUND_ROWS bei einem anderen Script versucht, hat bestens funktioniert!

Dies werde ich eventuell auch hier demnächst mal versuchen ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:29 Uhr.

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

© Dirk H. 2003 - 2023