Gerd H.: MySQL- RAND() Perfomance

Beitrag lesen

Hallo Forum,

ich hatte bei meinem Script ein wenig Performanceproblem, da ich mittlerweile immer mehr Besuicher auf meiner Site habe. Dabei geht es speziell um eine Abfrage, bei der 2 zufällige Zeilen aus der DB geleesen werden sollten.

Mit RAND() gibt es bei vielen DB-Einträgen Performanceprobleme.

So war die Lösung bisher:

  
$sql = '  
SELECT id, zelle  
FROM tabelle  
WHERE id NOT IN(ADMIN-ID, ADMIN2-ID, eigeneID) AND zelle IS NOT NULL AND bedingung1=1 AND bedingung2=3  
ORDER BY RAND()  
LIMIT 2';  
$result = mysql_query($sql);  
$max = mysql_num_rows($result);  
  
for($i=0;$i<$max;$i++) {  
 $row = mysql_fetch_object($result);  
 switch($i) {  
  case 0:  
   $userid1  = $row->id;  
   $zelle1   = $row->zelle;  
  break;  
  case 1:  
   $userid2  = $row->id;  
   $zelle2   = $row->zelle;  
  break;  
 }  
}  
  
  

Meine neue Lösung:

  
//Maximale Zahl aus der Tabelle1  
$res_max = mysql_query("SELECT MAX(id) AS max_zahl FROM tabelle");  
$row = mysql_fetch_object($res_max);  
$max_zahl = $row->max_zahl;  
  
//User1  
do {  
 $user_id1 = rand(1,$max_zahl);  
  
 $result = mysql_query("SELECT zelle FROM tabelle WHERE id=" . $user_id1 . " AND bedingung1='1' AND bedingung2=3 LIMIT 1");  
 $row    = mysql_fetch_object($result);  
 $zelle1   = $row->zelle;  
  
} while($zelle1=='');  
  
//User2  
do {  
 $user_id2 = rand(1,$max_zahl);  
  
 $result = mysql_query("SELECT zelle FROM tabelle WHERE id=" . $user_id2 . " AND bedingung1='1' AND bedingung2=3 LIMIT 1");  
 $row    = mysql_fetch_object($result);  
 $zelle2   = $row->zelle;  
  
} while($zelle2=='');  
  

Meint ihr das wird was bringen auf Dauer? Das Problem ist halt, dass IDs in der Datenbank fehlen, da sich Mitglieder auch bereits gelöscht haben und Lücken entstehen. Habt ihr andere Vorschläge? Indizes eventuell auch?

Sollte ich vielleicht beides in eine do...while Schleife packen und dann innerhalb dieser prüfen ob zelle bei beiden gesetzt ist. (Zelle ist übrigens ein Link aufs Foto des Profils)