Abfragedauer verringern?

chris4712

Erfahrenes Mitglied
Hallo!

Für ein Forum (basierend auf MySQL 5.0.18) habe ich mir folgende Abfrage ausgedacht:
Code:
SELECT
 TOPIC.TopicID AS TopicID,
 FirstPOST.Thema AS TopicThema,
 FirstPOST.Autor AS TopicAutor,
 FirstPOST.Icon AS TopicIcon,
 TOPIC.Hits AS TopicHits,
 TOPIC.Wichtig AS TopicWichtig,
 TOPIC.Geschlossen AS TopicGeschlossen,
 LastPOST.Datum AS LastPostDate,
 LastPOST.Autor AS LastAutor
FROM
 forum_topics AS TOPIC JOIN
 forum_posts AS FirstPOST ON (TOPIC.TopicID = FirstPOST.TopicID) JOIN
 forum_posts AS LastPOST ON (TOPIC.TopicID = LastPOST.TopicID)
WHERE
 FirstPOST.Datum =
  (SELECT MIN(Datum) FROM forum_posts WHERE TopicID = FirstPOST.TopicID AND Zeigen = 'true')
AND
 LastPOST.Datum =
  (SELECT MAX(Datum) FROM forum_posts WHERE TopicID = FirstPOST.TopicID AND Zeigen = 'true')
AND
 TOPIC.Zeigen = true
ORDER BY
TOPIC.Wichtig ASC,
 LastPOST.Datum DESC
 
LIMIT
 0, 15

Funktioniert auch Prima. Dauert aber teilweise bis zu 5 Sekunden!
Kann man es irgendwie beschleunigen?
Zur Info:
In der Post Tabelle sind 725 Einträge.
In der Topic Tabelle 70 Einträge

Gruß

Christian
 
Das dürfte an den beiden Subselects in der WHERE-Klausel liegen. So wie das geschrieben ist, werden diese für jeden Datensatz aus dem "Haupt-Query" einmal ausgeführt.

Besser wäre, Du würdest nur ein Subquery machen und dieses dazu-joinen:

SQL:
SELECT
  `TOPIC`.`TopicID`     AS `TopicID`,
  `FirstPOST`.`Thema`   AS `TopicThema`,
  `FirstPOST`.`Autor`   AS `TopicAutor`,
  `FirstPOST`.`Icon`    AS `TopicIcon`,
  `TOPIC`.`Hits`        AS `TopicHits`,
  `TOPIC`.`Wichtig`     AS `TopicWichtig`,
  `TOPIC`.`Geschlossen` AS `TopicGeschlossen`,
  `LastPOST`.`Datum`    AS `LastPostDate`,
  `LastPOST`.`Autor`    AS `LastAutor`

FROM
  `forum_topics` AS `TOPIC`
JOIN
  `forum_posts` AS `FirstPOST` ON `TOPIC`.`TopicID` = `FirstPOST`.`TopicID`
JOIN
  `forum_posts` AS `LastPOST`  ON `TOPIC`.`TopicID` = `LastPOST`.`TopicID`
LEFT JOIN
  (
    SELECT
      `TopicID`,
      MIN(`Datum`) AS `minDatum`,
      MAX(`Datum`) AS `maxDatum`
    FROM `forum_posts`
      WHERE `Zeigen` = 'true'
    GROUP BY
      `TopicID`
  )
    AS `subquery` ON `subquery`.`TopicID` = `TOPIC`.`TopicID`

WHERE
      `FirstPOST`.`Datum` = `subquery`.`minDatum`
  AND `LastPOST`.`Datum`  = `subquery`.`maxDatum`
  AND `TOPIC`.`Zeigen` = 'true'

ORDER BY
  `TOPIC`.`Wichtig` ASC,
  `LastPOST`.`Datum` DESC
 
LIMIT
  0, 15

Müsste so gehen,
Martin
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück