2010-12-14 18 views
0

Je remarque des problèmes de performance sur mon serveur MySQL. Le journal de requête lente affiche quatre requêtes qui provoquent le problème, prenant environ 10 secondes pour exécuter chaque requête. Je me demande s'il existe un moyen plus efficace d'exécuter la requête.Aide pour l'optimisation d'une requête SQL

Le tableau que je choisissais de compte environ 13 000 lignes, et est structuré comme:

id p year time   b  o   type 
1 dec 10 2010-12-02 12:34:27 1000 1000  cape 
2 jan 10 2010-12-02 12:34:27 1000 1000  cape 
3 feb 10 2010-12-02 12:34:27 1000 1000  cape 
4 q1 10 2010-12-02 12:34:27 1000 1000  cape 
5 q2 10 2010-12-02 12:34:27 1000 1000  cape 
6 q3 10 2010-12-02 12:34:27 1000 1000  cape 
7 q4 10 2010-12-02 12:34:27 1000 1000  cape 
8 11 10 2010-12-02 12:34:27 1000 1000  cape 
9 12 10 2010-12-02 12:34:27 1000 1000  cape 
10 dec 10 2010-12-02 12:34:27 1000 1000  pmx 
11 jan 10 2010-12-02 12:34:27 1000 1000  pmx 
12 feb 10 2010-12-02 12:34:27 1000 1000  pmx 
13 q1 10 2010-12-02 12:34:27 1000 1000  pmx 
14 q2 10 2010-12-02 12:34:27 1000 1000  pmx 
15 q3 10 2010-12-02 12:34:27 1000 1000  pmx 
16 q4 10 2010-12-02 12:34:27 1000 1000  pmx 

Je cours quatre requêtes - un pour chaque type, qui sélectionnent chaque p et l'ordre par le temps. Ces données sont affichées sur la face avant du site Web à travers quatre tableaux.

Les requêtes qui sont lentes sont:

SELECT type,id,p,time,b,o 
FROM zz 
WHERE id = (SELECT MAX(id) FROM zz AS f 
      WHERE f.p = zz.p 
      AND type = 'pmx') 
AND TYPE = 'pmx'; 

(alors la même pour trois autres types)

Quelqu'un at-il des conseils pour améliorer la requête réelle?

Merci

+0

Tout d'abord créé des indices sur le type, les colonnes d'identification –

+0

Merci pour cela, mais j'ai déjà des indices sur ces colonnes. – Aaron

Répondre

0

Que diriez-vous quelque chose comme

SELECT zz.type, 
     zz.id, 
     zz.p, 
     zz.time, 
     zz.b, 
     zz.o 
FROM zz INNER JOIN 
     (
      SELECT type, 
        MAX(id) MaxID 
      FROM zz 
      WHERE type IN ('1','2','3','4') 
      GROUP BY type 
     ) m ON zz.type = m.type 
      AND zz.ID = m.MaxID 

('1','2','3','4') sont les quatre types en question.

+0

Merci pour l'entrée, mais cette requête ne renvoie qu'une ligne, alors que ma requête renvoie severall. – Aaron

+1

Merci encore pour cela. J'ai fait quelques changements qui produisent le résultat que je cherchais, et le temps de requête est passé de 10 secondes à 0.2! SELECT zz.type, zz.id, zz.p, zz.time, zz.b, zz.o DE zz INNER JOIN ( SELECT p, max (id) AS maxid à partir de zz WHERE type = $ TYPE GROUPE PAR p ) b ON zz.p = bp ET zz.id = b.maxid O z zz.type = $ TYPE – Aaron