2012-10-14 2 views
0

Veuillez noter que la structure de la base de données ne peut probablement pas être modifiée sans beaucoup de travail en raison de la quantité d'utilisateurs et de données.Vous ne parvenez pas à déterminer quelle requête est réellement plus rapide

Le tableau "amis" est fondamentalement comme ceci:

> show create table `friends` 
CREATE TABLE `friends` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `user1` int(10) unsigned NOT NULL, 
    `user2` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `user1_2` (`user1`,`user2`), 
    KEY `user1` (`user1`), 
    KEY `user2` (`user2`) 
) ENGINE=InnoDB AUTO_INCREMENT=747908 

Pour récupérer les amis d'un utilisateur, j'ai trois options:

  1. Individuellement sélectionnez user2user1 est égal à l'ID de l'utilisateur, et vice inversement, puis combinez les résultats en PHP.
  2. SELECT IF([email protected],user2,user1) FROM friends WHERE @userid IN (user1,user2)
  3. SELECT user2 FROM friends WHERE [email protected]
    UNION SELECT user1 FROM friends WHERE [email protected]

J'ai essayé timings 2 et 3, ce qui est là que j'ai un problème: La première fois que je le lance, l'option 2 prend environ 400 ms alors que la seule option 3 prend moins de 1ms. Cependant, à chaque fois, opton 2 prend 0,6 ms et l'option 2 prend 0,8 ms.

Que dois-je faire? Quelle option est réellement plus rapide? Les EXPLAIN requêtes renvoient ceci:

id select_type table  type possible_keys key  key_len ref rows Extra 
1 SIMPLE  friends index NULL   user1_2 8  NULL 386438 Using where; Using index 

id select_type table  type possible_keys key  key_len ref rows Extra 
1 PRIMARY  friends ref user1,user1_2 user1_2 4  const 8  Using index 
2 UNION  friends ref user2   user2 4  const 8 
NULL UNION RESULT <union1,2> ALL NULL   NULL NULL NULL NULL 
+2

juste faire un script qui fonctionne chaque fois 1 million de fois et voir ce qui est plus rapide ... –

+0

Je crains que cela ne réponde pas vraiment à ma question, car je cours la requête plusieurs fois et obtenir des temps radicalement différents. –

+1

vous voulez dire que vous avez exécuté les deux requêtes 1 million de fois et que la requête A était plus rapide, puis l'avez fait à nouveau, et la requête B était plus rapide? –

Répondre

2

Comme d'habitude lors de l'analyse comparative, méfiez-vous des caches.

Mesurez vos requêtes SELECT à l'aide de la clause SQL_NO_CACHE (voir le SELECT syntax).

Questions connexes