phpbar.de logo

Mailinglisten-Archive

[dbs] Handler_read_rnd_next sehr hoch

[dbs] Handler_read_rnd_next sehr hoch

Sebastian Mendel lists at sebastianmendel.de
Don Okt 5 12:25:01 CEST 2006


ANGEL Harald schrieb:
> Nochmal der SQL:
>   SELECT meinung_profil. * , user.nickname, user.farbe  FROM 
>   meinung_profil  LEFT JOIN user ON meinung_profil.userid = user.userid
> 
>   WHERE meinung_profil.forumID = 30284  ORDER BY meinung_profil.threadid
> 
>   DESC, meinung_profil.sort_im_thread ASC  LIMIT 0 , 30

mhm, müsstest halt mla verschiedene Sachen probieren:

einen Index nur auf meinung_profil.forumID

das SELECT aufteilen:

SELECT
  *
FROM
  meinung_profil
WHERE
  meinung_profil.forumID = 30284
ORDER BY
  meinung_profil.threadid DESC,
  meinung_profil.sort_im_thread ASC
LIMIT 0, 30

SELECT
  user.nickname,
  user.farbe
FROM
  user
WHERE
  user.userid IN ([userids vom vorhergehenden select])


damit sparst du zwar nicht wirklich Arbeitsschritte, aber MySQL muss
keine so große temporäre Tabelle aufbauen.


oder die Sortierung in PHP vornehmen:

SELECT
  meinung_profil.meinungsID,
  meinung_profil.threadid,
  meinung_profil.sort_im_thread
FROM
  meinung_profil
WHERE
  meinung_profil.forumID = 30284

[sortieren und ids bestimmen in PHP]

z. B.:

while ($row = mysql_fetch(....)){
    $messages[sprintf('%011d%011d', 999999 - $row['threadid'],
$row['sort_im_thread'])] = $row['meinungsID'];
}
ksort($messages);
$selected_ids = implode(', ', array_slice($messages, 0, 30));



SELECT
  meinung_profil.*,
  user.nickname,
  user.farbe
FROM
  meinung_profil
LEFT JOIN
  user
ON
  meinung_profil.userid = user.userid
WHERE
  meinung_profil.meinungsID IN ($selected_ids)


wobei du beim messen immer beachten musst das der query cache immer erst
beim zweiten Aufruf greift, du also mindestens das query zweimal
unverändert aufrufen musst um ein vergleichbares Ergebnis zu erhalten.



-- 
Sebastian Mendel

www.sebastianmendel.de

php::bar PHP Wiki   -   Listenarchive