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:
- Individuellement sélectionnez
user2
oùuser1
est égal à l'ID de l'utilisateur, et vice inversement, puis combinez les résultats en PHP. SELECT IF([email protected],user2,user1) FROM friends WHERE @userid IN (user1,user2)
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
juste faire un script qui fonctionne chaque fois 1 million de fois et voir ce qui est plus rapide ... –
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. –
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? –