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

SQL Procédural MySQL Discussion :

Consommation excessive de ressources MySQL


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Par défaut
    J'aimerais bien que tu m'expliques quelle est selon toi la différence fondamentale entre l'utilisation des index dans une clause WHERE et dans des jointures
    ben tu va avoir une table catégorie de film avec comme clef primaire le numéro de la catégorie de film avec pour valeur

    1
    2
    3

    et une table film avec le numéro de film et chaque film appartient à une catégorie de film (donc une clef étrangère nommé "numéro catégorie film" sera ajouté dans la table film. Les valeurs dans la table film pour le champ numéro de film et numéro catégorie film pourraient être :

    N° de film 1 et comme catégorie de film 1
    N° de film 2 et comme catégorie de film 1
    N° de film 3 et comme catégorie de film 1
    N° de film 4 et comme catégorie de film 1
    N° de film 5 et comme catégorie de film 2
    N° de film 6 et comme catégorie de film 2
    N° de film 7 et comme catégorie de film 1

    si tu créer un index sur catégorie de film et le numéro de film en même temps le SBGD te créera un index de ce type (je pense car je n'ai pas étudié les index sous MySQL) :

    Num catégorie | Num Film
    1 | 1
    1 | 2
    1 | 3
    1 | 4
    1 | 7
    2 | 5
    2 | 6

    en faisant une jointure entre catégorie et film tu évitera au SBGD de : rechercher quels sont les films qui appartiennent à chaque catégorie et de trier les résultats car ce travail est déja fait dans l'index. Le SBGD n'aura alors qu'à séléctionner les valeurs dans l'index sans avoir à trier ou balayer dans tous les sens ce qui est donc plus rapide en cas de sélection avec des jointures mais sera plus lent lors des insertions ou modification qui touchent à une valeur de l'index car l'index devra alors être modifié.

    Ou bien encore imagine qu'on veut uniquement les films dont la catégorie d'appartenance est égal à 1 : le SBGD n'aura qu'à parcourir l'index jusque la catégorie soit différente de 1 (vu que l'index est trié) pour arrêter le balayage de l'index ce qui est bien plus rapide que de balayer séquentiellement toutes les valeurs du champ catégorie de film de la table film à la recherche d'un film avec pour catégorie de film le numéro 1 !

    Voilà

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Par défaut
    Citation Envoyé par Bluelane
    si je comprends bien une solution radicale pour échapper à ce BUG (car apparemment c'est un bug entre MySQL et FreeBSD) ce serait de passer à FreeBSD 5
    oui, mais comme tu l'indique c'est radical...
    je pense qu'in vaut mieux essayer d'investiguer encore un peu avant de te lancer dans un upgrade os.

    pour --skip-name-resolve, il faut le rajouter dans ta commande de démarrage de mysqld

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    En gros qu'est ce que ça va changer cette commande ? A quoi elle sert ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Par défaut
    D'aprés ce que j'ai lu, l'implemémentation de la recherche DNS est buggée sous FreeBSD 4xxx.
    la commande --skip-name-resolve évite à MySQL de faire des requetes DNS pour résoudre les noms de machines lors de connexions. Donc évite de faire appel à des fonctions buggées.
    Dans certain cas que j'ai vu, cette simple option au démarrage à résolu le problème de charge intempestive. Mais malheureusement pas dans tous les cas, donc il n'y a aucune garantie.
    Mais tu ne prends aucun risque en essayant .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Mais cette fonction n'a pourtant pas une utilité ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Par défaut
    Si, par exemple de résoudre le nom d'une machine (de donner son IP) si tu donne les permissions à un utilisateur depuis une machine X expressement nommé et pas par l'IP.
    du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRANT ALL PRIVILEGES ON test.* TO 'toto'@'machineX'
    je vois pas d'autre utilité à part peut-être dans le cadre de la réplication, mais je ne pense que ce soit ton cas.
    il y en a peut-être d'autre, c'est vendredi, j'ai du mal...
    quelqu'un voit un autre cas ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    L'IP me sert beaucoup dans mes scripts car les utilisateurs sont bloqués (quand ils ont fait des conneries) temporairement grâce à l'IP. Et ça nous permet de rapprocher les faux comptes.

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Par défaut
    oui, dsl, je m'exprime mal.
    si tu fonctionne avec des IP, pas de probleme.
    il peut y avoir probleme si tu utilise des noms de machines.

    pas de soucis pour les IP.

    tu as un serveur de test sur lequel tu peux reproduire ça, ou tu bosse direct en prod ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Je bosse directement en production, par contre ici on a un serveur local sur lequel on test des développements mais c'est un MySQL qui tourne sous Windows XP Pro.

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Par défaut
    fait le test en dev sous XP avec l'option de démarrage --skip-name-resolve. Si comme je le pressens RAS, alors fais de même en prod en surveillant le comportement pendant qq jours....

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Le problème c'est que sur notre serveur Local la surconsommation MySQL n'apparait pas. Ca ne le fait que depuis le serveur sous FreeBSD. On avait tenté l'oppération en y important toutes les bases de données la même configuration de Apache, MySQL et PHP.

  12. #12
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Citation Envoyé par tidou
    Num catégorie | Num Film
    1 | 1
    1 | 2
    1 | 3
    1 | 4
    1 | 7
    2 | 5
    2 | 6

    en faisant une jointure entre catégorie et film tu évitera au SBGD de : rechercher quels sont les films qui appartiennent à chaque catégorie et de trier les résultats car ce travail est déja fait dans l'index. Le SBGD n'aura alors qu'à séléctionner les valeurs dans l'index sans avoir à trier ou balayer dans tous les sens ce qui est donc plus rapide en cas de sélection avec des jointures mais sera plus lent lors des insertions ou modification qui touchent à une valeur de l'index car l'index devra alors être modifié.

    Ou bien encore imagine qu'on veut uniquement les films dont la catégorie d'appartenance est égal à 1 : le SBGD n'aura qu'à parcourir l'index jusque la catégorie soit différente de 1 (vu que l'index est trié) pour arrêter le balayage de l'index ce qui est bien plus rapide que de balayer séquentiellement toutes les valeurs du champ catégorie de film de la table film à la recherche d'un film avec pour catégorie de film le numéro 1 !
    Il me semble que tu confonds deux concepts séparés : l'intégrité référentielle, mise en oeuvre à travers des FOREIGN KEYS, et les index.

    Un index recense pour chaque valeur distincte d'une colonne les positions des lignes correspondantes dans le fichier de données de la table.
    En reprenant ton exemple : un index sur film.catégorie indiquera par exemple que les lignes de la table film ayant une catégorie égale à 1 se trouvent aux adresses (x, y, z) dans les données de la table, ceux de la catégorie 2 aux adresses (k, w), etc. Cela permet d'accéder directement aux emplacements des lignes recherchées sans tout passer en revue.

    Les clés étrangères quant à elles ne sont là que pour appliquer les règles d'intégrité référentielle, elles n'apportent aucune performance supplémentaire :
    Note that foreign keys in SQL are used to check and enforce referential integrity, not to join tables.
    (http://dev.mysql.com/doc/refman/5.0/...eign-keys.html)

    Ton tableau décrit peut-être bien la représentation interne des clés étrangères mais pas celle des index.
    Pour accélérer une jointure (comme toute autre requête effectuant une recherche), il faut un index, une foreign key ne suffit pas. D'ailleurs au passage certains ont demandé que MySQL crée l'index automatiquement en même temps que la clé étrangère : http://bugs.mysql.com/bug.php?id=3325.

    Voir aussi http://sqlpro.developpez.com/cours/sqlaz/ddl/?page=partie2#L10

  13. #13
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Bluelane, as-tu résolu ton problème ?

    Je ne sais pas si tu utilises le moteur InnoDB mais dans le cas contraire il serait peut-être intéressant de le désactiver (paramètre skip-innodb dans le fichier de conf).

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Bonjour,

    En quelques sortes... En fait nous passons la semaine prochaine sur un nouveau serveur, un dédié avec Debian... Ce qui devrait radicalement solutionner le problème de bug entre FreeBSD et MySQL !

    Nous qui pensions que FreeBSD était stable !!

  15. #15
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    OK.

    Bon courage et si tu repasses sur le forum, tiens-nous au courant du dénouement de l'affaire

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Merci beaucoup !

    En tous cas je tiens à remercier tous ceux qui sont invervenu sur ce topic car ça m'a vraiment aidé !

    C'est un forum génial et c'est vraiment sympa de pouvoir partager des connaissances ensemble..

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/05/2010, 16h22
  2. Quel langage consomme plus de ressources selon vous?
    Par joboy84 dans le forum Langages de programmation
    Réponses: 11
    Dernier message: 08/06/2008, 15h06
  3. Mon jeu consomme trop de ressources
    Par Le Barde dans le forum Développement 2D, 3D et Jeux
    Réponses: 13
    Dernier message: 07/11/2007, 08h16
  4. [Images] Erreur liée à une consommation excessive de mémoire
    Par cyrill.gremaud dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 04/11/2007, 22h55
  5. Cours, tutoriels, ressources MySQL
    Par Community Management dans le forum MySQL
    Réponses: 0
    Dernier message: 01/09/2005, 00h04

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