[Optimisation] SELECT valeur selon dates multiples
Bonjour à tous,
Je me permet de créer ce post en désespoir de cause...
Voici mon problème :
J'ai une table (sous MySQL: 5.0.51a) assez simple de ce type :
Code:
1 2 3 4
| Champ Type
ownerID bigint(20) INDEX
balance decimal(22,2)
date datetime INDEX |
Mais qui contient quelques millions de lignes.
Les dates ne sont pas fixes (environs toutes les 10 minutes avec des trous de plusieurs heures possible, ainsi qu'un décalage dans le temps, genre : 2011-10-18 06:09:58, 2011-10-18 06:20:19,...)
Dans ces lignes, j'aurais besoin de récupérer pour un ownerID, la valeur de balance actuelle, la balance -1 semaine et la balance -1 mois.
j'utilise pour le moment la requête suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| SELECT
( SELECT `balance`
FROM `table`
WHERE `ownerID`='.$_POST['characterID'].'
AND `date` > DATE_ADD(UTC_TIMESTAMP(),INTERVAL -2 HOUR)
ORDER BY `date` DESC
LIMIT 0,1) `balance`,
( SELECT `balance`
FROM `table`
WHERE `ownerID`='.$_POST['characterID'].'
AND `date` BETWEEN DATE_ADD(DATE_ADD(UTC_TIMESTAMP(),INTERVAL -1 WEEK),INTERVAL -1 DAY) AND DATE_ADD(UTC_TIMESTAMP(),INTERVAL -2 HOUR)
ORDER BY `date` DESC
LIMIT 0,1) `balance7`,
( SELECT `balance`
FROM `table`
WHERE `ownerID`='.$_POST['characterID'].'
AND `date` BETWEEN DATE_ADD(DATE_ADD(UTC_TIMESTAMP(),INTERVAL -1 MONTH),INTERVAL -1 DAY) AND DATE_ADD(UTC_TIMESTAMP(),INTERVAL -2 HOUR)
ORDER BY `date` DESC
LIMIT 0,1) `balance30`; |
Ce n'est pas propre du tout, j'appelle 3 fois une table assez grosse, ce qui plombe complètement les perfs de la requête...
J'aimerais donc savoir si on peut appeler une seule fois la table et récupérer les 3 valeurs souhaitées en une fois
NB : que les valeurs soient sous la forme
Code:
SELECT balance,balance7,balance30
ou où date correspond aux 3 dates recherchées, avec un résultat sur 3 lignes m'importe peu.
Voilà, j'espère avoir été assez clair, et surtout j'attends vos remarques avec impatience !
Merci d'avance à tout ceux qui prendront du temps pour me répondre ;)