Bonjour,

J'ai des requêtes qui peuvent atteindre 10-15sec pour "seulement" 100 000 lignes dans la table. Deux problèmes, je dois pouvoir conditionner/filtrer la requête (dans ma clause WHERE donc) sur quasiment n'importe quelle colonne et j'ai un UNION qui reprend les mêmes données pour une période différente, ce qui alourdit d'avantage les choses.
Des index sont posés sur les plus fréquemment utilisés mais il me semble que des indexes sur toutes les colonnes seraient contre productif, sachant que cette base est quotidiennement utilisée en écriture (entre 500 et 1000 lignes supplémentaires / jour).

L'objet du déli (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
 
SELECT
COUNT(*) AS "TOTAL",
ROUND(AVG(IF(R1!="0",R1-1,NULL)),1) AS "R1",
SUM(IF(`R1`!="0",1,0)) AS "R1E[]",
STD(NULLIF(`R1` ,0)) AS "R1D1",
ROUND((SUM(IF(`R1` IN("10","11"), 1,0)) / SUM(IF(`R1` > 0, 1,0)) - SUM(IF(`R1` IN("1","2","3","4","5","6","7"), 1,0)) / SUM(IF(`R1` > 0, 1,0))) * 100,0) as "RES",
ROUND(AVG(IF(`R2`!="0",R2,NULL)),1) AS "R2",
SUM(IF(`R2`!="0",1,0)) AS "R2E[]",
STD(NULLIF(`R2` ,0)) AS "R2D1",
ROUND(AVG(IF(`R3`!="0",R3,NULL)),1) AS "R3",
SUM(IF(`R3`!="0",1,0)) AS "R3E[]"
FROM `mytable`
WHERE `validation` BETWEEN TIMESTAMP("2017-01-01 00:00:00") AND TIMESTAMP("2017-06-15 23:59:59")
AND ((`RDT` BETWEEN '2017/04/01 00:00:00' AND '2017/04/30 23:59:59') OR (`RDT` BETWEEN '2017/03/01 00:00:00' AND '2017/03/31 23:59:59'))
UNION
SELECT
COUNT(*) AS "TOTAL",
ROUND(AVG(IF(R1!="0",R1-1,NULL)),1) AS "R1",
SUM(IF(`R1`!="0",1,0)) AS "R1E[]",
STD(NULLIF(`R1` ,0)) AS "R1D1",
ROUND((SUM(IF(`R1` IN("10","11"), 1,0)) / SUM(IF(`R1` > 0, 1,0)) - SUM(IF(`R1` IN("1","2","3","4","5","6","7"), 1,0)) / SUM(IF(`R1` > 0, 1,0))) * 100,0) as "RES",
ROUND(AVG(IF(`R2`!="0",R2,NULL)),1) AS "R2",
SUM(IF(`R2`!="0",1,0)) AS "R2E[]",
STD(NULLIF(`R2` ,0)) AS "R2D1",
ROUND(AVG(IF(`R3`!="0",R3,NULL)),1) AS "R3",
SUM(IF(`R3`!="0",1,0)) AS "R3E[]"
FROM `mytable`
WHERE `validation` BETWEEN TIMESTAMP("2017-01-01 00:00:00") AND TIMESTAMP("2017-06-15 23:59:59")
AND ((`RDT` BETWEEN '2017/06/01 00:00:00' AND '2017/06/30 23:59:59') OR (`RDT` BETWEEN '2017/05/01 00:00:00' AND '2017/05/31 23:59:59'))
Quand je dis simplifiée ça signifie en fait que j'ai beaucoup plus de colonnes traitées dans cette requête l'équivalent de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
ROUND(AVG(IF(`R2`!="0",R2,NULL)),1) AS "R2",
SUM(IF(`R2`!="0",1,0)) AS "R2E[]",
STD(NULLIF(`R2` ,0)) AS "R2D1",
se répète pour environ 70 à 120 colonnes, selon la table. A ce stade je bloque pour accélérer les choses, hormis un upgrade matériel qui n'est probablement pas la plus pertinente des solutions même si elle en fait peut-être parti.

Si une âme charitable a quelques conseils, des pistes voir des solutions... Merci d'avançe.