2010-08-05 9 views
3

Étant donné que 5000 ID d'enregistrements sont récupérés dans la base de données, quelle requête, selon vous, est la plus rapide?Optimisation de requête: Quelle syntaxe SELECT est la plus rapide?

  1. boucle à 5000 ID en utilisant PHP et exécuter une requête SELECT pour chacun,

    foreach($ids as $id){ 
        // do the query 
        $r = mysql_query("SELECT * FROM TABLE WHERE ID = {$id}"); 
    } 
    
  2. Ou recueillir tous les ids dans un tableau, et utiliser SELECT * FROM TABLE WHERE ID IN (1 up à 5000)

    //assuming $ids = array(1,2 ---- up to 5000); 
    $r = mysql_query("SELECT * FROM TABLE WHERE ID IN (".join(",",$ids).")"); 
    
+1

Avez-vous testé ...? – deceze

+6

Est-ce spécifique à MySQL? Créez une table, remplissez-la, puis mesurez. Les données battent l'opinion. – Manfred

+2

@ 0xA3 commentaire étonnant. –

Répondre

4

Sans l'ombre d'un doute, les charger tous en une fois sera plus rapide. L'exécution de 5 000 requêtes sera beaucoup plus lente, car chaque requête entraînera une certaine quantité de temps système.

Aussi, pour l'accélérer encore plus, N'utilisez PAS l'opérateur *! Sélectionnez les champs que vous allez utiliser, si vous avez seulement besoin de la colonne ID, spécifiez ceci! Si vous voulez toutes les colonnes, spécifiez-les toutes, car vous pouvez ajouter des champs plus tard et vous n'avez pas besoin de récupérer ce nouveau champ.

+2

+1 Mais attention à la longueur de la chaîne de requête construite. Avec la construction "IN", vous pouvez atteindre la longueur maximale. De plus, l'association de $ ids est soumise à une vulnérabilité d'injection SQL. Essayez d'utiliser mysql_real_escape_string() pour chaque identifiant. – ThinkJet

4

l'option 2 va certainement être plus rapide. 5000 requêtes db séparées vont avoir une énorme surcharge de connexion réseau.

0

Bien sûr le mesurer, mais je recommanderais certainement de laisser la base de données faire le travail. Tout dépend, j'espère que vous n'êtes pas en train de créer une connexion pour chaque appel.

2

Le moyen le plus rapide est de ne pas demander 5000 lignes du tout.
Vous avez à peine besoin de 100 pour les afficher sur une page. 5000 est trop cher

+1

Totalement dépend de l'objectif de la page, ce n'est pas vraiment une réponse. –

0

La boucle est plus rapide si vous utilisez une requête à l'aide de variables de liaison. Déclarer la déclaration hors de la boucle; puis à l'intérieur de la boucle lier la variable pour chaque id. Ne sous-estimez pas le temps passé à l'analyse SQL; surtout sur ces choses longues et sinueuses.

0

L'option 2 est plus rapide. Avec l'option 1, vous faites un roundtrim complet vers le serveur pour chaque itération.

Je tiens à préciser que dans ce cas, vous pourriez envisager d'utiliser la pagination pour afficher les données.

Indice: Mesurer, Mesurer, Mesurer. Avec un code valant 10 minutes de votre temps, vous aurez la réponse tout de suite.

0

Qu'est-ce qui est le plus rapide pour de nombreuses requêtes?
Essayez le mesurer par exemple comme ceci:

<?php 
    $start = getmicrotime(); 
    for ($i=0;$i<100000;$i++) 
    { 
      foreach($ids as $id){ 
       // do the query 
       $r = mysql_query("SELECT * FROM TABLE WHERE ID = {$id}"); 
      } 

    } 
    $end = getmicrotime(); 
    echo 'Time (1): '.($end- $start).' sec'; 



    $start = getmicrotime(); 
    for ($i=0;$i<100000;$i++) 
    { 
      //assuming $ids = array(1,2 ---- up to 5000); 
      $r = mysql_query("SELECT * FROM TABLE WHERE ID IN (".join(",",$ids).")"); 
    } 
    $end = getmicrotime(); 
    echo 'Time (2): '.($end- $start).' sec'; 
?> 
+0

vos tests sont bons pour rien –