Problème d'optimisation de rand ()

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par amaria, 24 Février 2010.

  1. amaria
    amaria Nouveau WRInaute
    Inscrit:
    28 Décembre 2009
    Messages:
    20
    J'aime reçus:
    0
    Bonjour,

    Pourrais qu'un m'aider d'optimiser de rand() :

    Le premier cas est avec rand() et vous voyez que c'est presque 60,000 rows. Et quand il s'agit d'une base de 200 000, on peut imaginer que c'est lent :?
    [​IMG]

    Le deuxième cas c'est l'affichage normal et la différence est importante :
    [​IMG]

    Merci d'avance :)
     
  2. dmathieu
    dmathieu WRInaute accro
    Inscrit:
    9 Janvier 2004
    Messages:
    5 596
    J'aime reçus:
    0
    En effet, rand est à éviter. La raison est simple : rand() fait une seconde requête sur votre table, réassigne un nouvel identifiant aléatoire à chacun des enregistrements et les ressors dans l'ordre de cet identifiant aléatoire (donc aléatoirement).

    Il n'existe pas de solution miracle en SQL pur.
    Une solution pour récupérer un enregistrement aléatoirement (et un seul. A ne pas faire dans une boucle pour récupérer tous les enregistrements :

    • Compter le nombre total d'enregistrements dans la base.
    • Générer un nombre aléatoire situé 1 et le nombre obtenu ci-dessus.
    • Récupérer tous les enregistrements de la base
    • Ne prendre que celui situé en position x

    Si aura non pas une seule requête mais deux. Mais cela sera toujours plus rapide qu'un rand.
     
  3. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    [grillé]

    C'est clair que c'est de façon générale une très mauvaise idée avec une table un tant soit peu importante: ça oblige le serveur à lire toute la table avant de faire un tri sur ce critère aléatoire (sur toute la table donc) puis d'en extraire juste quelques lignes.

    Plusieurs options (qui dépendent beaucoup de ce que tu veux exactement, tu contenu de ta table, de ce que tu sais à propos de ta table...):
    - juste prendre (par exemple) les X derniers enregistrements (en supposant que tu aies un index adapté)
    - si les enregistrements ont un ID séquentiel et que tu en connais l'étendue, tirer au sort N nombres dans cette étendue, et faire un select * from table where id in (n1,n2,n3...). Si tu as des "trous" dans ta séquence tu peux avoir besoin de fournir un peu plus d'IDs histoire d'en avoir le bon nombre à la fin du compte. evidemment il doit y avoir un index sur id.
    - stocker un nombre aléatoire dont l'étendue est connue dans chaque ligne de la table, mettre un index sur cette colonne, et faire une recherche avec colonne_aleatoire > nombre_aleatoire_dans_la_meme_entendue order by colonne_aleatoire limit N

    Il y en a probablement plein d'autres...

    Jacques.
     
  4. amaria
    amaria Nouveau WRInaute
    Inscrit:
    28 Décembre 2009
    Messages:
    20
    J'aime reçus:
    0
    Merci dmathieu et Jacques :)

    Car les enregistrements sont séquentiels et près qu'il n'y a pas de "trous", j'ai fais de la manière suivante:

    - récupérer le plus grand id de la table: select max(id) from table;

    - générer avec le php des chiffres aléatoire entre 0 et MAX(id). un peu plus de ce qu'il me faut, mais pour être sure que même s'il y aura de trous, je ferai le tri parmi le nombre assez grand.

    - faire une select des rows avec : select * from table where id in ( join(",", $ids) ) limit 20;

    merci encore pour votre aide :wink:
     
Chargement...
Similar Threads - Problème optimisation rand Forum Date
Test d'optimisation mobile : Problèmes de chargement de la page Débuter en référencement 10 Novembre 2019
Problème optimisation d'un count() : Mysql Développement d'un site Web ou d'une appli mobile 15 Février 2014
probleme optimisation? Débuter en référencement 27 Avril 2012
Problème d'optimisation de la base de donnée? ou problème du serveur Développement d'un site Web ou d'une appli mobile 11 Avril 2010
[réglé]Problème avec script lourdingue optimisation php? Développement d'un site Web ou d'une appli mobile 14 Août 2006
Optimisation nouveau Xeon qui pose problème Administration d'un site Web 24 Mai 2006
WordPress Problème affichage style avec Elementor (titre, bordures, separateur) Administration d'un site Web Lundi à 12:12
Problème d'indexation de backlinks Débuter en référencement 24 Juillet 2022
Problème d'indexation de backlinks Problèmes de référencement spécifiques à vos sites 21 Juillet 2022
Probleme de visibilité de ma page Facebook Facebook 5 Juillet 2022
problème avec le développeur Droit du web (juridique, fiscalité...) 22 Juin 2022
Problème désindexation des pages de Google Débuter en référencement 21 Juin 2022
Problème d'indexation de pages sur Google Problèmes de référencement spécifiques à vos sites 31 Mai 2022
problème de redirection non souhaitée Administration d'un site Web 28 Avril 2022
Problème d'indexation Produits Prestashop Crawl et indexation Google, sitemaps 28 Avril 2022
Problème d'affichage des campagnes Google Ads dans un tableau de bord Data Studio AdWords 26 Avril 2022
Problème de vitesse d'affichage des pages sur Analytics Google Analytics 26 Avril 2022
Problème : Google Crawl et Index des pages en No Index et bloqué par le robot.txt Crawl et indexation Google, sitemaps 26 Avril 2022
Problème avec GA4 : nb de visiteurs temps réel et par jour Google Analytics 19 Avril 2022
Problème indexation pages précises en React.js Débuter en référencement 19 Avril 2022