J'ai 4 tables: expéditions (200K enregistrements), magasins (45 enregistrements), magasins_produits (enregistrements 8K), districts (698 enregistrements). La requête suivante prend très longtemps à excute (12 secondes):Les performances de la requête Mysql sont lentes, besoin d'aide pour l'optimisation.
SELECT `s`. * , `p`.`productCode` , `p`.`productName` , `st`.`name` AS `storeName` , `d`.`name` AS `districtName`
FROM `shipments` AS `s`
JOIN `product_stores` AS `p` ON s.productStoreId = p.id
JOIN `stores` AS `st` ON s.storeId = st.id
LEFT JOIN `districts` AS `d` ON s.districtId = d.id
WHERE (s.storeId IN (1, 2, 3, 4, 6, 9, 14, 16, 22, 26, 30))
GROUP BY `s`.`id`
ORDER BY `s`.`id` DESC
LIMIT 100
requête EXPLIQUEZ le résultat suivant:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE st ALL PRIMARY NULL NULL NULL 45 Using where; Using temporary; Using filesort
1 SIMPLE s ref fk_shipments_stores1_idx,fk_shipments_product_stor... fk_shipments_stores1_idx 4 st.id 482
1 SIMPLE p eq_ref PRIMARY PRIMARY 4 s.productStoreId 1
1 SIMPLE d eq_ref PRIMARY PRIMARY 4 s.districtId 1
- Je ne sais pas pourquoi MySQL doit l'aide temporaire; Utilisation de filesort dans ce cas
- Pourquoi mysql ne commence pas à sélectionner des envois? puis rejoignez le magasin. il commence à sélectionner à partir du magasin, puis rejoindre les envois? J'essaie d'exécuter EXPLAIN et parfois mysql commencer à sélectionner de la table product_stores
- S'il vous plaît aidez-moi à optimiser la table, les index ... pour améliorer les performances.
(J'utilise MySQL 5.0.95)
Ce sont les structures de table:
Veuillez remplacer l'en-tête de votre question par quelque chose d'utile. –