Bonjour à tous !!!

J'ai (encore) un problème de requête MySQL à vous montrer.

Tout d'abord mon schéma (simplifié)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

Les 3 Tables importantes 

CREATE TABLE T_PARRES (
       PARRES_ID          INTEGER NOT NULL,
       PARRES_MEASURE_DATE TIMESTAMP NOT NULL,     
       MONPAR_ID          INTEGER NOT NULL,
) TYPE=INNODB;


CREATE TABLE T_MONPAR(
       MONPAR_ID          INTEGER NOT NULL,
       CXR_ID             INTEGER NULL
) TYPE=INNODB;


CREATE TABLE T_CXR(
	   CXR_ID             INTEGER NOT NULL,
) TYPE=INNODB;

Les Primary Keys

ALTER TABLE T_CXR
       ADD  ( PRIMARY KEY (CXR_ID) ) ;


ALTER TABLE T_MONPAR
       ADD  ( PRIMARY KEY (MONPAR_ID) ) ;

ALTER TABLE T_PARRES
       ADD  ( PRIMARY KEY (PARRES_ID) ) ;


Les Foreign keys

ALTER TABLE T_PARRES
       ADD CONSTRAINT fk_paramres_monparid FOREIGN KEY (MONPAR_ID)
                             REFERENCES T_MONPAR(MONPAR_ID) ;


ALTER TABLE T_MONPAR
       ADD CONSTRAINT fk_monparam_cxrid FOREIGN KEY (CXR_ID)
                             REFERENCES T_CXR(CXR_ID) ;


Les index

CREATE INDEX IND_PARRES_MEASURE_DATE ON T_PARRES
(
       PARRES_MEASURE_DATE                      ASC
);

CREATE INDEX IND_PARRES_MONPAR_DATE ON T_PARRES
(
       MONPAR_ID                      ASC,
       PARRES_MEASURE_DATE            ASC
);

Maintenant, la requête posant problème :

- Pour un cxr_id donné, et pour une fourchette de temps (en date) donnée, je voudrais les 1000 + récents objets T_PARRES

Donc j'ai effectuée une requête comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
select all_columns from T_PARRES r
inner join T_MONPAR m on m.monpar_id = r.monpar_id
where r.parres_measure_date between '2010-01-01' and '2010-01-15' and m.cxr_id = 145
order by r.parres_measure_date desc 
limit 1000;
Explain me gratifie d'un superbe :




Using filesort, using temporary.

Je sais que cela provient du "order by" mais je vois pas d'autre moyen de faire pour récupérer les 1000 PARRES les plus récents :/

Les charges des tables : (à peu près)

- T_PARRES : entre 10 000 000 & 100 000 000 lignes
- T_MONPAR : entre 100 000 & 500 000 lignes
- T_CXR : entre 4000 & 7000

Toutes vos remarques, conseils sont les bienvenus, merci ^^

PS : "select *" je sais select * c'est pas bien, mais c'était pour le test