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 d'un serveur mysql (table avec 130 millions de données)


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut Optimisation d'un serveur mysql (table avec 130 millions de données)
    Bonjour,

    Actuellement en possession d'une base de données comprenant une table d'environ 20Go(130 millions de records), je cherche un moyen d'optimiser le serveur mysql (ses paramètres mais aussi ceux de l'OS sur lequel il est : Linux (Centos 5)).

    Car actuellement une simple requête avec une jointure sur une table de 2Go (10 millions de records) avec un GROUP BY prend 5 minutes.
    Les champs de la clause WHERE ont été indexés et la requête et les tables ont été optimisés au maximum.

    Je réalise des tests actuellement pour savoir quels seraient les optimisations à faire, mais elle sont longues a tester sur une telle base de données.
    Pouvez vous m'indiquer quelles sont les réglages les plus influent sur la rapidité d'exécution d'une requête ?

    Si ca continue je vais devoir tester sous d'autres SGBD, comme postgreSQL, pour de meilleurs performances

    Merci pour votre aide !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 390
    Par défaut
    bonjour.

    De ce que j'ai identifié, les paramètres qui influence le plus les performances sont ceux ci:
    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
    # pour agir sur les performances c'est celle la qu'il faut changer
    max_connections = 25
    key_buffer_size = 128M
    max_allowed_packet = 50*1024*1024
    table_cache = 1024
    sort_buffer_size = 6M
    join_buffer_size = 6M
    net_buffer_length = 8K
    read_buffer_size = 6M
    #read_rnd_buffer_size = 1M
    #myisam_sort_buffer_size = 224M
    query_cache_size = 80M
    query_cache_type = 1
    query_cache_min_res_unit = 1k
    #open_files_limit = 2048
    #max_tmp_table = 128
    #thread_concurrency = 4
    tmp_table_size = 48M
    max_heap_table_size = 48M
    wait_timeout = 86400
    table_open_cache = 600
    thread_concurrency = 3
    .
    NB : ne pas tenir compte des valeurs, les optimiser pour votre utilisation

    Je m'aide souvent des script décrit dans ce post pour régler finement le serveur.

    Au niveau matériel, ceux qui influe le plus est la rapidité des disques et beaucoup de mémoire vive.

    Au niveau de l'OS, je ne connais rien à optimiser. Si vous trouvez ça m'interresse.

    Concernant les requetes, il faut bien faire attention car parfois l'optimiseur se perds. Surtout je pense quand beaucoup de champs sont index. Il commence pas forcément par la table ququel on s'attends. Un moyen de controler l'optimiseur est l'utilisation du

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    C'est a peu près les paramètres que j'avais identifié mais d'autres me sont encore inconnus, je vais étudié cela.

    Je vais aussi de ce pas regarder la page de script.

    En tout cas merci de ta réponse. Je reposterais ici, si je trouve une quelconque optimisation pour l'OS

    A bientôt

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Excusez moi, j'ai une autre question.

    J'ai modifier les paramètres du serveur donc je suis passé pour l'exécution de ma requête de 360 secondes à 240 secondes. A partir de là, je ne descend pas plus bas.

    Je précise que je teste pour l'instant uniquement UNE seule requête, il n'y a aucune autre connection sur mon serveur pendant ce temps.

    J'ai même essayé d'augmenter à un point déraisonnable les valeurs, rien n'y fait.

    Comment puis-je réduire le temps d'exécution de cette unique requête juste avec la configuration du serveur ?

  5. #5
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Citation Envoyé par frite333 Voir le message
    Les champs de la clause WHERE ont été indexés
    Et les autres champs qui participent à un order éventuel, ceux des jointures, du group by ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 390
    Par défaut
    il est également possible d'indexer sur deux champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create index index_nom_prenom on utilisateur (nom,prenom)
    Cela peut être plus performants cela depends vraiment de l'utilisation .

  7. #7
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Bonjour,
    Je vais peut être dire un truc bête, mais si la situation le permet, c'est à dire si vous pouvez vous permettre d'avoir des données à J+1, pourquoi ne pas créer une table qui regroupe toutes vos colonnes nécessaires, en gros dénormaliser, puis indexer les bonnes colonnes ? Vous mettrez cela à jour chaque nuit.
    Une autre idée, ne serait il pas possible de créer une vue qui regroupe ces tables, sur certaines bdd je sais qu'on peut indexer les colonnes d'une vue, ce serait peut être plus rapide.
    Sinon, est ce que le faire via une simple procédure stockée n'améliore pas un peu le temps.
    Bon courage

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Merci pour vos réponses !

    Tout d'abord, au niveau des index tout a été fait, dans les requêtes ainsi que dans les sous requêtes et bien sur aussi sur plusieurs champs.

    @patic : Ta solution n'est pas réalisable. Par contre les vues et les procédures stockés ont déjà été testés mais n'améliorent pas du tout le temps d'exécution sur une telle masse de données.

    Je reprécise par ailleurs que je recherche plutôt une solution au niveau de la configuration du serveur (et de l'OS si c'est possible).

    Pour l'instant grâce à la configuration j'ai pu atteindre une amélioration globale de mes requête de 20% sur le temps d'exécution.
    Je crois comprendre que lors du traitement des requêtes, la création de tables temporaire ne peut se faire en mémoire (dû à la taille des tables concernés) et se fait donc sur le disque.
    | Created_tmp_disk_tables | 0 |
    | Created_tmp_files | 5 |
    | Created_tmp_tables | 7 |
    Cependant ces données issus d'un SHOW STATUS après 3 requêtes identiques montrent qu'il n'a pas fait de tables temporaires sur le disque mais par contre à créé des fichiers temporaires (es ce qu'ils contiennent des tables temporaires ?).
    Si c'est le cas, alors le temps d'exécution est dû à la rapidité de lecture/écriture du disque dur ? Et simplement cela ?

    Que ce soit le cas ou non, connaissez-vous une méthode/technique/astuce pour optimiser le traitement de mes requêtes ?

    Je vous remercie d'avance, pour toute l'aide que vous m'apportez.

  9. #9
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 700
    Par défaut
    Bonjour,

    ta question est encore trop vague. Il nous faudrait savoir :
    - la version du serveur Mysql utilisé
    - le SHOW CREATE TABLE de ta table
    - un exemple de requete très lente.

    En ce qui concerne le fichier my.cnf cité en exemple :
    - le key_buffer_size est trop petit, il ne faut pas hésiter a réserver 1/3 de la RAM pour celui-ci
    - le innodb_buffer_pool_size joue le même rôle que key_buffer_size mais pour les tables innodb. Ne pas hésiter à lui réserver beaucoup de mémoire.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par frite333 Voir le message
    Si ca continue je vais devoir tester sous d'autres SGBD, comme postgreSQL, pour de meilleurs performances
    Dans votre cas et compte tenu que vous faites des requêtes d'agrégation, si vous voulez des performances il faut un SGBDR qui sache faire des vues indexées.
    Seules solutions : Oracle (mais les vues matérialisées sont asynchrone et le serveur est cher) ou MS SQL Server (vues indexées synchrones).
    Pour démo, voir l'étude que j'ai mené sur l'amélioration d'une requête portant sur 1 250 000 lignes, faisant passé le temps de réponse que quelques seconds à non mesurables....
    http://sqlpro.developpez.com/optimisation/indexation/

    Enfin sur les performances de MySQL, ce SGBD (pseudo relationnel) n'a jamais été conçu pour les performances.... contrairement à une légende...
    Lisez les articles que j'ai écrit à ce sujet :
    MySQL un ersatz de SGBDR : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/
    Benchmark SQL Server / PostGreSQL / MySQL : http://blog.developpez.com/sqlpro/p9...lles-en-sql-1/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Encore une fois merci pour vos réponses

    @ddoumeche
    Encore une fois ma question ne porte ni la structure des tables, ni la requête.
    Au niveau du key_buffer_size, vous avez raison et je pense que le mien est bien réglé.

    @SQLpro
    Je pense que c'est exactement la réponse que j'attendais. Le problème c'est qu'il est difficilement réalisable dans le cas présent d'envisager un changement de SGBD.
    Quoi qu'il en soit, je pense être arrivé au maximum des possibilités de MySQL et au bout de ma question. Je passe mon post en résolu.
    Je vais donc lire votre étude, et faire mes propres test.

    Je vous remercie tous pour votre aide. A bientôt !

  12. #12
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Bonjour,
    Vous y gagnerez peut être un peu avec une mise à jour de mysql vers la dernière version (5.6) ... Je ne pense pas que cela impactera beaucoup vos développements en cours.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Je ne pense pas que ce sera influant.
    Certaines des plus grosses requêtes prennent plusieurs heures, je ne pense pas qu'un mise a jour de mysql permettrait une grande amélioration du temps de traitement :s

  14. #14
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    Salut,

    Une solution, peut-être, est de voir si tu peux scinder tes données grâce à un système de hash et donc te retrouver à brasser des tables plus petites... diviser pour mieux règner

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

Discussions similaires

  1. Optimisation de my.cnf (MySQL/MariaDB) avec InnoDB
    Par Webmas. dans le forum Administration
    Réponses: 0
    Dernier message: 15/04/2014, 16h42
  2. Réponses: 5
    Dernier message: 14/10/2008, 11h54
  3. Table avec Tera-octets de données
    Par namstou3 dans le forum Oracle
    Réponses: 4
    Dernier message: 11/10/2007, 23h01
  4. Table avec Tera-octets de données
    Par namstou3 dans le forum Oracle
    Réponses: 1
    Dernier message: 10/10/2007, 23h48
  5. [mysql]table avec foreign key
    Par samjung dans le forum Langage SQL
    Réponses: 24
    Dernier message: 24/11/2005, 14h42

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