Si vous voulez effectuer un vrai order by rand(), en supposant que cela ait un sens particulier, il n'y a rien à faire , ce sera lent car vous demandez au serveur de prendre une valeur aléatoire pour chaque ligne, de tout classer pour en retenir quelques lignes, déterminées par le limit.
Dans la pratique, c'est la mauvaise méthode utilisée par pas mal de modules et programmes pour tirer 8 news au hasard parmi un gros paquet.
Je vous suggère cette méthode
- ajoutez une colonne appelée ordre_variable type int, faites en un index simple
ALTER TABLE `la_table_de_la_requete` ADD `ordre_variable` INT NOT NULL DEFAULT '0' AFTER `bbb`, ADD INDEX (`ordre_variable`);
- exécutez une première fois et ensuite par cron tous les jours ou toutes les semaines:
UPDATE la_table_de_la_requete set ordre_variable = int(RAND()*1000000) ;
- transformez la requête
select ... where ... order by rand() limit 0,8 ;
en
set @a=800000*rand() ;
select ... where ... AND ordre_variable > @a order by ordre_variable limit 0,8 ;
Avec 400.000 lignes, on peut être sûr d'avoir 8 lignes qui satisfont la nouvelle condition. Le Rand() reste efficace même si entre 2 passages en Cron , les séquences sont fixes dès qu'on a déterminé la position de la première ligne sélectionnée. Mais l'effet recherché est bien là.
Pour installer le cron, installez le module Cron de votre Cms ou bien contactez votre SAV pour une solution avec crontab sur votre serveur web.