IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Optimisation requête UNION


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 34
    Points : 20
    Points
    20
    Par défaut Optimisation requête UNION
    Bonjour à tous

    j'expose rapidement la problématique :
    script php made "home" multi site, c'est à dire : plusieurs sous domaines qui tapent vers le même script et la même base de données. Pour chaque sous domaine, j'ai 1 table dédiée XXXX_posts (où XXXX est le nom du sous domaine), chaque table à exactement la même architecture.
    Pour sortir les 10 derniers "post" insérés à travers toutes les tables j'utilise UNION
    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
    			SELECT `id`, `title`, `created`, `ssdom` FROM alpha_posts
    		UNION
    			SELECT `id`, `title`, `created`, `ssdom` FROM bravo_posts
    		UNION
    			SELECT `id`, `title`, `created`, `ssdom` FROM charlie_posts
    		UNION
    			SELECT `id`, `title`, `created`, `ssdom` FROM delta_posts
     
    			WHERE
    				actif = '1'
    			ORDER BY
    				`created`
    			DESC
    			LIMIT
    				10
    ça fonctionne sans problèmes, c'est à dire que la requête me sort bien les 10 derniers posts toutes tables confondues.
    Mais me voilà entrain de multiplier les sous domaines, donc à chaque fois un UNION en plus, et là je me pose la question de l'optimisation ... si j'ai 50 sous domaine, donc 50 tables, que chaque tables contient une moyenne de 5 000 posts, j'ai peur que la requête soit très très lourde (requête effectuée à chaque chargement de page) !

    j'ai les "bases" en SQL mais pas les reins assez solides pour confirmer (ou pas) ma crainte d'un manque d'optimisation / lourdeur. Donc mes questions :
    1 - mon raisonnement est il bon ou je me plante, MySQL va s'en sortir pépère ?
    2 - Il y a t'il possibilité d'optimiser tout ça ?

    Par avance merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Perso, je commencerai par mettre un LIMIT dans chaque requête, sachant que tu ne peux pas prendre plus de 10 enregistrements par table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `id`, `title`, `created`, `ssdom` FROM bravo_posts ORDER BY created DESC LIMIT 10
    Au lieu de faire un ORDER BY sur 5'000*50 enregistrements, tu le feras sur 10*50 ...

    Ensuite, je comprends pas d'où sort le , ce champ n'apparaît nulle part, mais peut-être que cette condition devrait aussi être remontée au niveau de chaque sous-requête ?

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    A mon avis, si tout part dans la même base de données, c'est la modélisation qu'il faut revoir.
    Une seule table posts, avec un champ domaine pointant sur une table référençant les différents domaines serait bien plus efficace... Notamment à l'ajout de domaines (comme c'est le cas ici) .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    @ced > Il est vrai que j'aurais du prévoir le coup et faire autrement ... le problème c'est que maintenant il est un peu trop tard pour modifier à ce niveau

    @mrcmrc > je fais suivre ton conseil et coupler avec une mise en cache dans un fichier que je vais rafraîchir à chaque ajout de post

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [10g] Optimisation requête UNION
    Par Julien59 dans le forum SQL
    Réponses: 12
    Dernier message: 11/05/2012, 17h45
  2. Optimisation requête avec UNION
    Par vaccary dans le forum SQL
    Réponses: 7
    Dernier message: 19/07/2011, 14h06
  3. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08
  4. Requête UNION sous Interbase 6 ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 27/07/2004, 09h08
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo