2016-07-28 8 views
4

Ich habe eine Tabelle mit mehr als 800K rows. Ich versuche zufällig 4 IDs zu bekommen. Meine Abfrage funktioniert schnell, aber manchmal gibt es eine, manchmal zwei und manchmal keine Ergebnisse. Irgendeine Idee warum? HierLIMIT gibt nicht immer die gleiche Anzahl von Zeilen zurück

ist die Abfrage:

select * from table 
    where (ID % 1000) = floor(rand() * 1000) 
    AND `type`='5' 
    order by rand() 
    limit 4 

die type='5' nur 1603 Zeilen und es nicht immer geben Sie mir 4 Reihen. wenn ich es in type='11' ändern, funktioniert es gut. Irgendeine Idee, wie man das repariert?

hier ist mein Code in Yü

$criteria = new CDbCriteria(); 
$criteria->addCondition('`t`.`id` % 1000 = floor(rand() * 1000)'); 
$criteria->compare('`t`.`type`', $this->type); 
$criteria->order = 'rand()'; 
$criteria->limit = 4; 

return ABC::model()->findAll($criteria); 

PS: ein großen und wachsenden Tisch zu sein, wird

+1

Wenn Sie eine schnelle Abfrage benötigen, dann verwenden Sie nicht 'rand' in' MySQL' – DarkBee

+0

Related: http://StackOverflow.com/Questions/1823306/Mysql-Alternatives-Torrender-Brand- – topher

Antwort

1

Offensichtlich eine schnelle Abfrage benötigen. Es sind nicht unbedingt Zeilen vorhanden, die die Bedingung where erfüllen.

Eine Alternative ist mit der where Klausel ganz zu verzichten:

select t.* 
from table t 
where `type` = 5 
order by rand() 
limit 4; 

Hier ist ein Weg, diese effizienter zu machen (und den Index auf table(type) hilft):

select t.* 
from table t cross join 
    (select count(*) as cnt from table t where type = 5) x 
where `type` = 5 and 
     rand() <= 5*4/cnt 
order by rand() 
limit 4; 

Die "5" ist willkürlich. Aber es sollte in der Regel mindestens vier Zeilen abrufen.

1

Die Rand-Funktion ist wiederholt für jede Zeile, so erhalten Sie eine Poisson-Verteilung Anzahl der Übereinstimmungen. Könnte 0 sein, könnte 1 sein, könnte 312 - mit unterschiedlichen Wahrscheinlichkeiten.

+0

Can Sie dokumentieren die "Poisson-Verteilung" von 'rand()'. Ich bin mir ziemlich sicher, dass es eine einheitliche Verteilung ist, und die beiden sind sehr unterschiedlich. –