[Select] Un select avec using filesort, using temporary. C'est moche
Bonjour à tous !!!
J'ai (encore) un problème de requête MySQL à vous montrer.
Tout d'abord mon schéma (simplifié)
Code:
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:
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 :
http://img46.imageshack.us/img46/1667/explainb.th.jpg
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 ;)