2012-12-22 7 views
2

je sur la table des produits de l'indice suivant: (product_t, ProductID, forsale). Le manuel MySQL dit:groupe par Ralentit la requête

Les GROUP BY désignent uniquement les colonnes qui forment un préfixe à gauche de l'index et pas d'autres colonnes. http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

Quand je fais la requête suivante

SELECT z.product_t, COUNT(z.productid) 
FROM xcart_products z 
JOIN xcart_products_lng w ON z.productid = w.productid 
AND w.code = 'US' 
WHERE z.forsale = 'Y' 
group by z.product_t 

Et donc en utilisant le champ d'index le plus gauche (product_t), le temps d'exécution est encore massif:

+-----------+--------------------+ 
| product_t | COUNT(z.productid) | 
+-----------+--------------------+ 
| B   |     4 | 
| C   |    10521 | 
| D   |     1 | 
| F   |     16 | 
| G   |    363 | 
| J   |     16 | 
| L   |    749 | 
| M   |     22 | 
| O   |    279 | 
| P   |    5304 | 
| S   |     22 | 
| W   |    662 | 
+-----------+--------------------+ 
12 rows in set (0.81 sec) 

Lorsque j'utilise le index complet (product_t, productid, forsale), le temps d'exécution est rapide (0.005 secondes). Comment dois-je le modifier pour accélérer la requête?

enter image description here

Je pense en quelque sorte la requête pourrait être améliorée par l'utilisation d'un demi ... rejoindre Cependant, je ne sais pas comment ...

+0

Je pense que le mieux fait –

+0

@GrijeshChauhan pls vérifier ma nouvelle réponse. J'ai réussi à le faire haha ​​ – bicycle

+0

BON RIEN N'EST IMPOSSIBLE !! .. Très bien .. Je vais lire votre réponse aussi. –

Répondre

1

Le ralentissement pourrait ne pas être lié à la clause GROUP BY. Essayez d'ajouter un index pour w.code et z.forsale individuellement.

MySQL Profiling peut également vous aider dans votre entreprise

+0

ajouter les index pour w.code et z.forsale n'a malheureusement pas améliorer quoi que ce soit. J'ai vérifié le profilage et j'ai vu un anomoly. Le goulot d'étranglement majeur est l'envoi de données 0.124638 – bicycle

+0

pls vérifier ma nouvelle réponse. J'ai réussi à le faire haha ​​ – bicycle

0

La réponse la plus évidente serait de créer un nouvel index pour product_t uniquement. Pouvez-vous créer de nouveaux index?

+0

cependant je vous pouvez par requête regardez-utiliser une seule par table ... J'ai ajouté le plan d'exécution et deux index. Celui que j'ai mentionné (product_t, productid, forsale) et un second de product_t seulement. Vous pouvez le voir ne prend que le premier. Si ce ne serait pas, les champs de la vente et ProductID ralentirait la requête ... – bicycle

0

Heureusement j'ai trouvé un moyen comment augmenter la vitesse. J'ai eu une autre table où tous les product_t sont définis. Chaque produit_t utilise également le champ 'code' (pour spécifier la traduction de chaque produit_t). Dans ce tableau, j'ai un index défini sur product_t et le code aussi bien. En changeant la requête à:

SELECT z.product_t, COUNT(z.productid) 
FROM xcart_products z 
JOIN xcart_products_lng w ON z.productid = w.productid 
JOIN xcart_products_product_t_lng p ON z.product_t = p.product_t 
AND p.code = 'US' 
WHERE z.forsale = 'Y' 
group by p.product_t,p.code 

J'ai réussi à augmenter la vitesse à 0,10 secondes. La raison pour laquelle c'est plus rapide est parce que le regroupement par est maintenant fait sur un index entier. Deuxièmement, le code où 'US' est remplacé par la grande table products_lng, à la petite table product_t_lng. Je pense que c'est le plus efficace de la requête peut être ...

mysql> SELECT z.product_t, COUNT(z.productid) 
     -> FROM xcart_products z 
     -> JOIN xcart_products_lng w ON z.productid = w.productid 
     -> JOIN xcart_products_product_t_lng p ON z.product_t = p.product_t 
     -> AND p.code = 'US' 
     -> WHERE z.forsale = 'Y' 
     -> GROUP BY p.product_t, p.code 
     -> ; 
    +-----------+----------------------+ 
    | product_t | COUNT(z.productid) | 
    +-----------+----------------------+ 
    | B   |     4 | 
    | C   |    10521 | 
    | F   |     16 | 
    | G   |     363 | 
    | L   |     749 | 
    | M   |     22 | 
    | O   |     279 | 
    | P   |     5304 | 
    | S   |     22 | 
    | W   |     662 | 
    +-----------+----------------------+ 
    10 rows in set (0.14 sec) 
+0

bon, car la quantité de données que vous vérifié dehors? ... Je vous conseille de vérifier avec grande taille. –

+0

@GrijeshChauhan Merci! 22,343 produits. La base de données utilise simplement les paramètres normaux et n'a pas été réglée. – bicycle