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

Administration MySQL Discussion :

[MySQL] Partitionnement horizontal utile


Sujet :

Administration MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut [MySQL] Partitionnement horizontal utile
    Bonjour à tous !

    Je me tourne vers vous pour quelques avis et/où retours d'exp.

    Voici notre problématique, nous possédons une appli Java/J2EE qui attaque une BD MySQL (full table innoDB).

    Sur cette BD, se trouve une table qui peut attendre les 100 millions d'enregistrement (voire plus). Cette table est attaquée la plupart du temps en écriture (70% du temps) et le reste en lecture (en fait c'est une table qui stocke les résultats de notre application).

    Une de nos obligations est de fournir au client graphique de notre appli la possibilité de purger/archive/restaurer certaines lignes de cette table. (Ces actions se font selon une plage de temps précise, par exemple : je veux détruire tous les résultats entre les dates D1 & D2).

    En résumé le client peut :

    - Détruire une partie des résultats sans faire de sauvegarde
    - Détruire une partie des résultats en faisant une sauvegarde (sous forme de dump réalisé avec mysqldump)
    - Restaurer une partie des résultats grâce à une sauvegarde faite précédemment avec mysqldump.

    Le problème étant que ces opérations (surtout la destruction) prennent énormément de temps.

    - Nous avions donc mis en place un index sur la colonne des dates : ça a améliorait les perfos mais bon pas assez au goût du client

    - Nous avons essayé une autre façon de faire, à savoir récupérer les identifiants primaires des résultats en fonction des dates saisies par le client (comme la colonne des primary key est auto incrémentée, on prend les 2 bornes des dates, on récupère les primary id correspondants, et on fait un DELETE FROM ... WHERE PRIMARY_KEY BETWEEN V1 & V2) : toujours pas top.

    - Donc, nouvelle piste, et c'est là que j'ai besoin de vos conseils, nous pensions réalisé un partitionnement horizontal (partition en fonction de cette fameuse colonne de date).

    Cependant, nous avons pu constater que MySQL souffrait d'une limitation assez pénible, à savoir qu'un table partitionnée ne supporte pas les foreign keys, et comme par hasard, cette table en question en possède un certain nombre.

    J'ai pu lire des articles sur le sujet qui indiquent des contournements, comme par exemple, placer des triggers pré-insertion pour vérifier les contraintes de foreign keys...

    - Pensez-vous que cela vaille le coup d'établir un partitionnement horizontal sur cette table, sachant qu'il va falloir mettre en place ce système de triggers pour vérifier les contraintes de keys?

    - Sinon, avez-vous des tuyaux concernant la suppression massive de lignes sur une table InnoDB (je sais que, InnoDB n'est pas forcément prévu pour ça mais bon, la structure était déjà en place que nous n'étions pas nés...) ?

    Merci pour vos futurs conseils

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Ce n'est certainement pas avec MySQL que vous améliorerer ce genre de chose, sauf à augmenter drastiquement les ressources du serveur notamment en multipliant le nombre de disques physique et en choisissant un RAID approprié.
    En effet, MySQL ne sait pas gérer finement les espaces de stockage et son partitionnement est un leurre qui provoque généralement plus de dégâts qu'autre choses (complexification des plans de requêtes, absence de contraintes...).
    Vous êtes sans doute aux limite de MySQL et AMHA il serait souhaitable de changer pour un SGBDR plus costaud, capable de bien gérer les espaces de stockage et le journal de transaction.
    Voir les articles que j'ai écrit à ce sujet :
    http://blog.developpez.com/sqlpro/p8...plexes-dans-l/
    http://blog.developpez.com/sqlpro/p8...t-le-stocakge/

    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/ * * * * *

  3. #3
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Bonjour et merci pour votre réponse.

    Je sais bien que MySQL n'est pas forcément le SGBD le plus adapté pour faire des suppressions massives (surtout avec des tables InnoDB), malheureusement, il nous est impossible de changer de SGBD ...

    Donc nous cherchons avant tout, à "limiter la casse" :/

    J'ai lu les 2 articles, et celui qui décrit comment faire une suppression logique à travers des vues me semble pertinent.

    Nous allons donc tenter cette approche... Le fait de faire la suppression réelle des lignes aux heures creuses semble très approprié dans notre cas.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Bonjour,

    Tu peux essayer d'utiliser Maatkit avec mk-archiver qui est spécialement fait pour répondre à ce genre de problème.

    Tu verras dans la partie Description de l'outil un lien extrêmement intéressant sur des stratégies possibles d'archivage qui devraient t'ouvrir des horizons , et ce d'autant plus qu'apparemment tu te trouves dans le cas le plus favorable, qui est d'avoir des plages où ta base est inactive ou peu active.

    En tout cas, si ta stratégie est bonne, si ton modèle de données est bon et si tes requêtes sont bonnes, l'opération est largement réalisable, même avec MySQL comme diraient certains

    Stéphane

  5. #5
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Bonjour.

    Je viens de réaliser qu'il y'avait une nouvelle réponse !!

    Merci pour ce retour

    Je vais enquêter et je vous tiens au courant

Discussions similaires

  1. Partitionnement horizontal par liste
    Par sagat06 dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/04/2014, 13h34
  2. Réponses: 2
    Dernier message: 21/09/2009, 17h26
  3. Optimisation table Mysql - Partitionnement
    Par thibaut06 dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/01/2008, 01h20
  4. MySql Timestamp en java.util.Calendar
    Par Invité dans le forum JDBC
    Réponses: 7
    Dernier message: 25/06/2007, 09h45

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