8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai un petit soucis à cause d'une base de données à la conception plutôt moyenne - dont je n'ai pas en charge l'architecture -, je dois réaliser le front office qui se retrouve particulièrement lent. J'essaie d'optimiser au mieux mes scripts alors je viens vers vous.

Une des partie les plus lentes concerne des données sur deux tables complètement différentes mais dont les résultats doivent être mélangés, je passe donc par un UNION.

Par exemple, pour un COUNT j'ai ceci :

				SELECT SUM(count) AS count FROM
				((
					SELECT
						COUNT(DISTINCT T1.id_champ) AS count
					FROM
						table1 T1 INNER JOIN ... - 4 INNER JOIN -
					WHERE
						- UNE DIZAINE DE WHERE SUR 5 TABLES -
				)
				UNION
				(
					SELECT
						COUNT(DISTINCT T1.id_champ) AS count
					FROM
						table2 T1 INNER JOIN ... - 5 INNER JOIN -
					WHERE
						- UNE DIZAINE DE WHERE SUR 6 TABLES -
				))
				temp


Déjà la c'est assez "fouilli" mais les tables sont totalement différentes, donc pas d'autre choix que de passer par un UNION et une table temporaire à ma connaissance.

Pour l'affichage des données, c'est pire, même avec une limite à 24 résultats :

				(
					SELECT
						PLEIN DE CHAMPS SELECTIONNE ...
					FROM
						table1 T1 INNER JOIN ... - 4 INNER JOIN -
					WHERE
						- UNE QUIZAINE DE WHERE SUR 5 TABLES -
					ORDER BY champs ASC
					LIMIT 0, 24
				)
				UNION
				(
					SELECT
						PLEIN DE CHAMPS SELECTIONNE ...
					FROM
						table2 T1 INNER JOIN ... - 5 INNER JOIN -
					WHERE
						- UNE QUIZAINE DE WHERE SUR 5 TABLES -
					ORDER BY champs ASC
					LIMIT 0, 24
				)
				ORDER BY champs ASC
				LIMIT 0, 24


Avez-vous une petite idée de comment améliorer les performances ? Le cache MySQL est activé. J'ai entendu dire que UNION ALL était beaucoup beaucoup plus rapide, pourtant lorsque je fais "UNION ALL" au lieu de "UNION", je n'ai pas vraiment de résultats probants mais peut-être que je l'utilise mal.

Merci beaucoup d'avance Smiley smile
salut tu pourrais pas détailler un peu plus ???

sinon ..

pourquoi ne pas passser par des array ??

faire un fichier xml ? puis l'utiliser ensuite, vu qu'il sera bien rangé ?
La lenteur peut venir de plusieurs facteurs: performance du serveur, taux d'occupation du serveur, nombre d'enregistrements présents dans les tables, respect des contraintes d'intégrité, etc...

Après, si la base de données n'est pas optimisée, ce que tu peux faire, c'est de :
- récupérer les infos dont tu as besoin avec les UNION et co.
- les copier dans une table COPIE, optimisée. (et sans contrainte d'intégrité pour virer les vérifications, et gagner du temps.)
- ne travailler qu'avec cette table COPIE.
- relancer le processus toutes les X heures pour mettre à jour les enregistrements. (cron job)

Les + :
- Toutes les infos sont dans une table, basique. Les clients génèrent donc de petites requêtes et ne saturent pas le serveur.
- Les grosses requêtes ne se lancent qu'une fois toutes les X heures, et pas à chaque demande d'affichage par un client.

Les - :
- La table avec laquelle on travaille n'est qu'une copie et ne reflète pas le contenu réel. (à X heures près)

=> Tout dépend de ton projet, si les données changent souvent, si besoin de "temps réel", etc...