otrdiena, 2010. gada 25. maijs

Efektīva random lietas atlase MySQL

Atradu labu rakstu par to, kā labāk atlasīt nejaušus objektus datubāzē.

MySQL pieprasījumos funkciju izmantošana nav ieteicama, jo tās nevar kešot un to izpilde prasa papildus laiku. Tāpēc ierasto nejaušas lietas vaicājumu:

SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
var efektīvi pārvērst šādā:
$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query("SELECT * FROM `table` LIMIT $offset, 1 ");

Ja visu tabulas ierakstu parādīšanās random atlasē nav kritiska, tad piemēram random bildītes atlasi tabulā kurā ir vismaz 1000 ierakstu var optimizēt līdz šādam kverijam.

$random_bilde = mysql_query("SELECT * FROM bildes LIMIT ".rand(1,1000).", 1");

1 komentārs:

Anonīms teica...

Ar vienu ierakstu šāds risinājums der, bet problēmas sākas tad, kad vajadzīgi, piemēram, 10 no miljona.