Herzlich willkommen im Archiv vom ABAKUS Online Marketing Forum
Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.
Code: Alles auswählen
EXPLAIN SELECT DISTINCT topic
FROM posts
WHERE poster = 2
AND forum NOT IN (0)
Code: Alles auswählen
EXPLAIN SELECT DISTINCT topic
FROM posts FORCE INDEX(poster_topic)
WHERE poster = 2
AND forum NOT IN(0)
Wo haste denn das her ? SQL ist so schnell wie du es programmierst. Das langsamste ist die Verbindung zwischen MySQL und PHP. Deshalb schiebt man da so wenig wie möglich durch. Außerdem ist PHP um Größenordnungen langsamer als SQL.mgutt hat geschrieben:Also eins habe ich in den letzten Jahren gelernt. Wenn was langsam ist, dann SQL und nicht PHP
Das ist eigentlich ganz einfach. Die Prozedur kannst du wie einen SQL-Befehlt über die Schnittstelle an die Datenbank geben und dann liegt sie da rum und kann benutzt werden. Das geht sogar bei Freehostern. Ich weiß gar nicht, ob man das explizit abstellen kann.mgutt hat geschrieben:Allerdings habe ich von SP keine Ahnung. Und vom direkten Hantieren auf der Datenbank: Vermutlich geht das gar nicht, weil ich Managed hoste.
SQL ist ein Flaschenhals, daher kann es so schnell sein wie es will. Wenn der Prozessor belastet wird, laufen die Abfragen gerne mal auf und dann ist Schluss mit lustig. Daher behaupte ich, dass SQL langsamer ist. Zumindest hatte ich noch nie Probleme in PHP und das schon seit 5 Jahren Wachstum.Lord Lommel hat geschrieben:Wo haste denn das her ? SQL ist so schnell wie du es programmierst. Das langsamste ist die Verbindung zwischen MySQL und PHP. Deshalb schiebt man da so wenig wie möglich durch. Außerdem ist PHP um Größenordnungen langsamer als SQL.mgutt hat geschrieben:Also eins habe ich in den letzten Jahren gelernt. Wenn was langsam ist, dann SQL und nicht PHP
Das Gegenteil ist der Fall. Du musst dir nur klar machen, was du da eigentlich mit SQL tust: Du willst aus Gigabyte einzelne Daten haben und das wenn möglich in Nanosekunden. Probier doch mal die Datenhaltung und das entsprechende Abfragen in PHP zu implementieren. Und dann wirst du vor SQL auf die Kniee fallen.mgutt hat geschrieben: SQL ist ein Flaschenhals, daher kann es so schnell sein wie es will. Wenn der Prozessor belastet wird, laufen die Abfragen gerne mal auf und dann ist Schluss mit lustig. Daher behaupte ich, dass SQL langsamer ist. Zumindest hatte ich noch nie Probleme in PHP und das schon seit 5 Jahren Wachstum.
Ja allerdings erzeugt die Abfrage ja einen temporary table und das ist wohl auch der Grund, warum der index poster_forum_topic langsamere Ergebnisse resultiert als poster_forum.bfs hat geschrieben:Was deine Frage zu den Indizes angeht, so würde ich sagen poster_forum_topic ist dafür maßgeschneidert und eindeutig die beste Wahl. Das sagt ja auch das "using index" aus: mysql kann alle Teile des Queries aus dem Index bedienen.
Ja, liegt natürlich an DISTINCT. Warum beim anderen Index temporary nicht auftaucht, verstehe ich allerdings nicht.Das er für poster_topic kein "using temporary" ermittelt würde ich auf die Ungenauigkeiten von explain in Kombination mit DISTINCT schieben, da dieses eine effiziente Indexnutzung verhindert. Was sagt denn explain ohne "DISTINCT", ist das "using temporary" dann weg?
Das ist z.B. ein Grund, warum PHP schneller als MySQL ist, auch wenn es Äpfel und Birnen sind. Tatsächlich habe ich meine Abfrage jetzt erstmal so angepasst, dass ich mit zwei SELECTs arbeite. Im ersten Fall lese ich alle topics aus, nutze array_unique() und lege sie dann wieder in die zweite Abfrage mit IN(). Das mache ich aber mit einem Filter. Und zwar setze ich voraus, dass ich nur die Themen ausgebe, in denen der letzte Beitrag eines Nutzers maximal 90 Tage alt ist. Auf die Art fallen die Themen raus, in denen er sich sowieso nicht mehr beteiligt und das Ergebnis ist maximal 1000 Zeilen stark. Allerdings gab es da bereits die erste Beschwerde, weshalb ich da mit Optionen arbeiten musste.Wenn es mengenmässig machbar ist, dann ist es oft schneller sich ALLE Werte geben zu lassen und die Duplikate durch die Anwendung zu eliminieren.
Code: Alles auswählen
SELECT topic
FROM posts FORCE INDEX(poster_time)
WHERE poster = 2
AND time > ' . (time() - 7776000)
$topics = array_unique($topics);
$total = count($topics);
if ($total > 4) {
SELECT t.*, h.*
FROM topics t FORCE INDEX(PRIMARY), hosts h FORCE INDEX(PRIMARY)
WHERE t.moved = 0
AND t.host = h.host
AND t.forum NOT IN(0)
AND t.topic IN(' . implode(', ', $topic_ids) . ')
ORDER BY t.last_time DESC
LIMIT 300
}
Code: Alles auswählen
else {
SELECT t.*, h.*
FROM topics t FORCE INDEX(PRIMARY), posts p FORCE INDEX(poster_topic), hosts h FORCE INDEX(PRIMARY)
WHERE t.moved = 0
AND t.host = h.host
AND t.forum NOT IN(0)
AND t.topic = p.topic
AND p.poster = 2
GROUP BY p.topic
ORDER BY t.last_time DESC
LIMIT 300
}