web-dev-qa-db-fra.com

Query, tables identiques, mais différentes expliquer et performances

J'ai deux tables levels et users_favorites

 + -------------------- + -------------- + ------ + - ---- + --------- + ------- + 
 | champ | Tapez | null | clé | Par défaut | Extra | [. .____] + -------------------- + -------------- + ------ + ----- + --------- + ------- + 
 | id | int (9) | NO | PRI | NULL | | [.____] |. User_id | int (10) | NO | MUL | NULL | | [.____] |. Level_name | varchar (20) | NO | | NULL | | 
 | user_name | varchar (45) | NO | | | | NULL 
 | note | décimales (3,2) | NO | | 2,50 | | 
 | votes | int (5) | NO | | 0 | | [. .____] | lectures | int (5) | NO | | 0 | | 
 | date_published | date | NO | MUL | NULL | | [. ____] |. user_comment | varchar (255) | OUI | | NULL | | [.____] |. playable_character | int (2) | NO | MUL | 1 | | [.____] |. is_featured | tinyint (1) | NO | MUL | 0 | | [. .____] + -------------------- + -------------- + - ----- + ----- + --------- + ------- + 
 + ---------- + -------- + ------ + ----- + --------- + - ------ + 
 | champ | Tapez | null | clé | Par défaut | Extra | [. .____] + ---------- + -------- + ------ + ----- + --------- + ------- + 
 | user_id | int (8) | NO | PRI | NULL | | [.____] | level_id | int (8) | NO | PRI | NULL | |.. [.____] + - + --------- -------- + ------ + ----- + --------- + ------- + 

J'ai mon environnement de développement local et les serveurs de production. Cette requête:

 Id SELECT, nom_niveau, date_published, évaluation des niveaux 
 WHERE id IN (SELECT level_id DE users_favorites WHERE user_id = 2) 
; [. .____]

court très vite sur place (environ 0,0X secondes) et très lent sur la production (~ 15 secondes). Explain de sont différents. Le local:

 L'identifiant de type table select_type possible_keys clés lignes ref key_len supplémentaire 
 1 SIMPLE de uniq_user_level de users_favorites, idx_user idx_user 4 const 21 "Utilisation de l'index" 
 1 niveaux de SIMPLE eq_ref PRIMAIRES 4 users_favorites.level_id 1 "Utilisation où" 

Et sur la production:

 id select_type type de table possible_keys clés lignes ref key_len Extra 
 1 niveaux primaire ALL NULL NULL NULL NULL 3368988 "Utilisation où" 
 2 "DEPENDANT sous-requête" users_favorites eq_ref uniq_user_level, idx_user uniq_user_level 8 const, func 1 "Using index" 

Je sais que les données est le même parce qu'il a été importé et exporté à partir du même schéma. J'ai couru OPTIMIZE et fait que les index sont les mêmes, essayé de forcer les index. Rien n'a fonctionné.

La seule différence que je peux repérer est la version de MySQL: 5.6.10 localement il est, sur la production, il est 5.5.34-log. Si c'est la raison pour laquelle, je vais mettre à niveau, mais je me demande s'il y a une autre raison pourrait? Ou façon de formuler la requête de sorte qu'il réduit toujours par la sous-requête d'abord, comme il le fait sur place: 21 lignes au lieu de 3.368.988?

TIA

5
Hal50000

Il suffit de faire une jointure simple. Les sous-requêtes ne fournissent pas le meilleur résultat assez souvent

EXPLAIN SELECT l.id, l.level_name, l.date_published, l.rating
FROM levels AS l
INNER JOIN users_favorites AS uf 
ON uf.level_id = l.id
WHERE l.user_id = 2;
3
georgecj11