ถ้า data เยอะๆ order by rand() ไม่ดีแน่ๆครับ ห้ามใช้เด็ดขาดไอ order by rand() อ่ะ
ให้ใช้วิธี random ใน php แล้วไป query เอาครับ เช่นให้ใช้วิธี random ใน php แล้วไป query เอาครับ เช่น
$minId = rand(0,10000);
$result = mysql_query("SELECT * FROM `table` where id>$minId LIMIT 1");
** ใช้ > เพื่อกัน missing row ในกรณีเป็น auto increase
**** วิธีนี้ต้องรู้ range ของ data ที่แน่นอนครับ
แต่ถ้าข้อมูลไม่นิ่ง มีเพิ่มเรื่อยๆ ก็ให้ใช้วิธีนี้ครับ
สร้างตารางเป็น memory engine เอาไว้เก็บผลการ random ครับ วิธีนี้จะช้าตอนที่ query ครั้งแรก กับตอน data ในอีก table หมดครับ
เช่น ตาราง table กับ tablerand
function queryRandom(){
$result = mysql_query("select tr.*, (select min(tr2.trid) as mini from tablerand tr2) from tablerand tr where tr.trid = mini");
if(mysql_num_rows($result)==0){
prepareData();
return queryRandom();
}
else{
// delete from tablerand where id = mini
return ...; // return result of the query
}
}
function prepareData(){
// insert into tablerand select null as trid, t.* from table t order by rand() limit 100-1000
}
ตรงไหนเป็น comment ก็ไปเพิ่ม code เอาเองนะครับ
** ตาราง table rand ให้มี trid เป็น pk auto increase นะครับ
ปล. วิธีที่ 2 อาจจะช้าก็ได้นะ แค่ลองคิดแปลกๆ 55+ แต่คิดว่าน่าจะไวเพราะเอา memory engine มาใช้กับอีกตาราง