Bonjour,
Je souhaiterai optimiser la requête suivante :
SELECT a.id, DATE_FORMAT(a.temps, '%d-%m-%Y') as photo_temps, a.serveur, a.immatriculation, a.immatriculation_texte, a.id_unique, a.version, a.numero_serie, a.proprietaire, a.lieu_pays, a.lieu_type, a.lieu_aeroport, a.orientation, b.version as version_nom, c.type as proprietaire_type, c.nom as proprietaire_nom, c.url_rewriting as proprietaire_ur, c.oaci as proprietaire_oaci, d.login, d.nom, d.prenom, e.nom_fr as aeroport_nom, e.oaci as aeroport_oaci, e.aita as aeroport_aita, f.nom_fr as pays_nom, f.code as pays_code FROM photos a INNER JOIN versions b ON a.version = b.id INNER JOIN proprietaires c ON a.proprietaire = c.id INNER JOIN membres d ON a.membre = d.id LEFT JOIN aeroports e ON a.lieu_aeroport = e.id LEFT JOIN pays f ON a.lieu_pays = f.id WHERE a.statut = '4' AND a.numero_serie = '1' ORDER BY a.temps ASC LIMIT 0, 20
En effet, voici un EXPLAIN de cette requête :
1 2 3 4 5 6 7 8
|
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ref membre,statut,version,proprietaire statut 1 const 6 Using where; Using temporary; Using filesort
1 SIMPLE d ALL PRIMARY NULL NULL NULL 3 Using where
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 pictaero_com.a.version 1
1 SIMPLE c eq_ref PRIMARY PRIMARY 4 pictaero_com.a.proprietaire 1
1 SIMPLE e eq_ref PRIMARY PRIMARY 4 pictaero_com.a.lieu_aeroport 1
1 SIMPLE f eq_ref PRIMARY PRIMARY 2 pictaero_com.a.lieu_pays 1 |
Ce sont les 2 premières lignes de cet EXPLAIN qui me dérangent un peu ! J'ai plusieurs index sur ces tables, et j'ai les index suivant sur la table "photos" :
1 2 3 4 5 6 7 8 9 10
| Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
photos 0 PRIMARY 1 id A 9 NULL NULL BTREE
photos 1 membre 1 membre A 1 NULL NULL BTREE
photos 1 statut 1 statut A 1 NULL NULL BTREE
photos 1 immatriculation 1 immatriculation A 9 NULL NULL BTREE
photos 1 appareil 1 appareil A 9 NULL NULL BTREE
photos 1 id_unique 1 id_unique A 9 NULL NULL BTREE
photos 1 version 1 version A 9 NULL NULL BTREE
photos 1 proprietaire 1 proprietaire A 9 NULL NULL BTREE
photos 1 lieu_aeroport 1 lieu_aeroport A 3 NULL NULL BTREE |
J'ai aussi un index sur le "d.id" (membres.id) mais mySQL semble s'en moquer, il parcoure toute la table pour trouver le résultat.
Actuellement les tables sont peu remplies, les requêtes sont donc exécutées assez rapidement mais ça devrait assez rapidement se remplir et donc être plus lent...
Merci par avance pour votre aide à l'optimisation de cette requête !
Partager