[MySQL] Fusionner 2 requêtes en une (MySQL 3.23 only ...)

Fusionner 2 requêtes en une (MySQL 3.23 only ...) [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-01-2003 à 19:01:26    

Soit les deux requêtes suivantes :
 
SELECT * FROM tables 1 WHERE champ1 = $i AND champ2 = 1;
SELECT * FROM tables 1 WHERE champ3 = 1;
 
Il y a un index compound sur champ1/champ2, et un deuxième index sur champ3. Chaque requête prend un petit centième de seconde, c'est nickel. Mais pour des raisons pratiques je voudrais fusionner ces deux requêtes en une seule, sans perdre en performance évidement. J'ai essayé :
 
SELECT * FROM tables 1 WHERE (champ1 = $i AND champ2 = 1) OR champ3 = 1;
 
Mais c'est catastrophique niveau temps d'exécution. Un EXPLAIN montre que MySQL n'utilise même pas un seul index. En forcant l'utilisation d'un des deux index par USE INDEX() c'est un peu mieux, mais ca reste très loin du temps d'exécution cumulé des 2 requêtes séparées. La solution serait bien évidement d'utiliser UNION, mais je tourne sous MySQL 3.23 et dans un soucis de portabilité ces requêtes doivent rester compatibles avec les versions antérieures à la 4.0.0. Une idée ?

Reply

Marsh Posté le 07-01-2003 à 19:01:26   

Reply

Marsh Posté le 09-01-2003 à 18:01:45    

Core 666 a écrit :

Soit les deux requêtes suivantes :
 
SELECT * FROM tables 1 WHERE champ1 = $i AND champ2 = 1;
SELECT * FROM tables 1 WHERE champ3 = 1;
 
Il y a un index compound sur champ1/champ2, et un deuxième index sur champ3. Chaque requête prend un petit centième de seconde, c'est nickel. Mais pour des raisons pratiques je voudrais fusionner ces deux requêtes en une seule, sans perdre en performance évidement. J'ai essayé :
 
SELECT * FROM tables 1 WHERE (champ1 = $i AND champ2 = 1) OR champ3 = 1;
 
Mais c'est catastrophique niveau temps d'exécution. Un EXPLAIN montre que MySQL n'utilise même pas un seul index. En forcant l'utilisation d'un des deux index par USE INDEX() c'est un peu mieux, mais ca reste très loin du temps d'exécution cumulé des 2 requêtes séparées. La solution serait bien évidement d'utiliser UNION, mais je tourne sous MySQL 3.23 et dans un soucis de portabilité ces requêtes doivent rester compatibles avec les versions antérieures à la 4.0.0. Une idée ?


Ca gère pas les UNION MySQL ?
En Oracle, tu pourrais faire ça :
 
SELECT * FROM tables 1 WHERE champ1 = $i AND champ2 = 1
UNION
SELECT * FROM tables 1 WHERE champ3 = 1;
 
Je sais pas si c'est possible avec MySQL ...


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 10-01-2003 à 08:26:50    

Voir la fin de mon premier message => UNION n'est supporté qu'à partir de MySQL 4 :(

Reply

Marsh Posté le 10-01-2003 à 10:52:43    

Core 666 a écrit :

Voir la fin de mon premier message => UNION n'est supporté qu'à partir de MySQL 4 :(


Ah, j'avias pas vu ...
Désolé ... :whistle:


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 12-01-2003 à 05:36:09    

malheureusement y a pas bcp d'alternative, à part en passant par une temporary table de type heap

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed