Lors d’une montée en version de MariaDB, mon application a rencontré des problèmes de lenteur.
Notes des ajustements qui m'ont permis de diviser par 10 le temps d'exécution de mes requêtes sur une table de 500 000 enregistrements.
🔹 Théorie - Ordre des colonnes dans l'index composite 🔹
1️⃣ programme_id — (ÉGALITÉ)
→ Filtrage rapide de toutes les données d'un programme particulier.
2️⃣ presultat3 — (ÉGALITÉ ou IN)
→ Filtrage sur le résultat (à inclure ou non).
3️⃣ presultat9 — (ÉGALITÉ ou "<> ''")
→ Filtrage sur le champ non vide.
4️⃣ DATE_VISITE — (PLAGE)
→ Filtrage par plage de dates (avec LIKE) ou par range.
5️⃣ presultat1 — (REGROUPEMENT)
→ Utilisé par le GROUP BY.
🔹 En pratique - Choix final de MariaDB parmis toutes les combinaisons disponibles 🔹
SELECT *
FROM `BDDphysore`
WHERE
id IN (
SELECT
max(id) AS id
FROM `BDDphysore`
WHERE
`DATE_VISITE` LIKE '2025%'
AND `programme_id` = '126'
AND `presultat3` IN ('Relevé_Fin','Relevé_Mise_En_Pause')
GROUP BY `presultat1`
)
CREATE INDEX idx_piegegage_req01
ON BDDphysore (programme_id, presultat3, DATE_VISITE, presultat1);
SELECT *
FROM `BDDphysore`
WHERE
id IN (
SELECT
max(id) AS id
FROM `BDDphysore`
WHERE
`DATE_VISITE` LIKE '2025%'
AND `programme_id` = '126'
AND `presultat7` != ''
AND `presultat3` != 'Détermination'
GROUP BY `presultat1`
)
CREATE INDEX idx_piegegage_req02
ON BDDphysore (programme_id, presultat7, presultat1, DATE_VISITE, presultat3);
SELECT *
FROM `BDDphysore`
WHERE
id IN (
SELECT
max(id) AS id
FROM `BDDphysore`
WHERE
`DATE_VISITE` LIKE '2025%'
AND `programme_id` = '126'
AND `presultat9` != ''
AND `presultat3` != 'Détermination'
GROUP BY `presultat1`
)
CREATE INDEX idx_piegegage_req03
ON BDDphysore (programme_id, presultat9, presultat1, DATE_VISITE, presultat3);
SELECT id, presultat1, LENGTH(presultat1) AS longueur FROM BDDphysore ORDER BY longueur DESC SELECT presultat1, CHAR_LENGTH(presultat1) AS length FROM BDDphysore WHERE CHAR_LENGTH(presultat1) > 255 ORDER BY length DESC LIMIT 10; ALTER TABLE BDDphysore MODIFY presultat1 VARCHAR(255), MODIFY presultat3 VARCHAR(255), MODIFY presultat7 VARCHAR(255), MODIFY presultat9 VARCHAR(255);
EXPLAIN SELECT * FROM `BDDphysore` WHERE id IN ( SELECT max(id) AS id FROM `BDDphysore` WHERE WHERE DATE_VISITE >= '2025-01-01 00:00:00' AND DATE_VISITE <= '2025-12-31 23:59:59' AND `programme_id` = '126' AND `presultat7` != '' AND `presultat3` != 'Détermination' GROUP BY `presultat1` ) EXPLAIN SELECT * FROM `BDDphysore` WHERE id IN ( SELECT max(id) AS id FROM `BDDphysore` WHERE DATE_VISITE COLLATE utf8mb3_general_ci LIKE '2025%' AND `programme_id` = '126' AND `presultat7` != '' AND `presultat3` != 'Détermination' GROUP BY `presultat1` )
SELECT
LEFT(t1.DATE_VISITE, 10) AS DATE_FIN,
t1.presultat1 AS NOMDUPIEGE,
t1.presultat3 AS Etat
FROM BDDphysore t1
JOIN (
SELECT MAX(id) AS id, presultat1
FROM BDDphysore
WHERE DATE_VISITE LIKE '2025%'
AND programme_id = '126'
AND presultat3 IN ('Relevé_Fin', 'Relevé_Mise_En_Pause')
GROUP BY presultat1
) t2 ON t1.id = t2.id;
SELECT
LEFT(b.`DATE_VISITE`,10) AS DATE_VISITE,
b.`presultat3`,
b.`presultat7`,
b.`presultat9`
FROM `BDDphysore` b
INNER JOIN (
SELECT
MAX(id) AS id,
presultat1
FROM `BDDphysore`
WHERE
`DATE_VISITE` LIKE '2025%'
AND `programme_id` = '126'
AND `presultat7` IS NOT NULL AND `presultat7` <> ''
AND `presultat3` IS NOT NULL AND `presultat3` <> 'Détermination'
GROUP BY `presultat1`
) max_ids ON b.id = max_ids.id;
@@sql_mode est une variable système de MariaDB (et MySQL) qui détermine le comportement et les contraintes que le serveur applique
lorsqu'on exécute des instructions SQL.+-----------------------------------------------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------------------------------------------+ | IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------------------------------------------+✅ IGNORE_SPACE : ignore les espaces dans certaines syntaxes de fonction.