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 limité à 16 index par table


Sujet :

Administration MySQL

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut MySQL limité à 16 index par table
    bonjour,

    j'ai une table avec plus de 40 champs dont 24 ayant besoin d'un index.
    Au moment de la création, j'ai une erreur francisée qui dit :

    #1070 - Trop de parties specifiées dans la clef. Maximum de 16 parties

    je suppose que c'est l'erreur anglaise : too many key parts specified max 16 parts allowed

    est-ce que ce 16 est modifiable ?
    Ma version de mysql est 5.7.42-log (sur un hébergement mutualisé)


    Merci de votre conseil et lecture.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Tu veux créer 1 index contenant plus de 16 colonnes.

    A maximum of 16 columns is permitted for multicolumn indexes. Exceeding the limit returns an error.

    ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
    https://dev.mysql.com/doc/refman/5.7...db-limits.html
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut
    bonjour,

    j'ai fait une erreur de manipulation.

    J'utilise phpmyadmin, je me suis rendu compte que cocher plusieurs colonnes et utiliser l'option "index" en bas de la liste des champs, ne permettait pas de créer un index pour chacune des colonnes mais un index de colonnes fusionnées

    en gros, au lieu de générer ça quand on coche les colonne 1 2 et 3:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER TABLE `personnes` ADD INDEX(`creneau01`); 
    ALTER TABLE `personnes` ADD INDEX(`creneau02`); 
    ALTER TABLE `personnes` ADD INDEX(`creneau03`);

    il générait ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE `personnes` ADD INDEX( `creneau01`, `creneau02`,`creneau03` );

    ce qui n'est pas du tout la même chose ! ça m'apprendra à être fénéant et utiliser les outils IHM plutôt que les lignes de commandes !
    Je passe en résolu!

    même si je viens de découvrir qu'il existe aussi une limite de 64 champs indéxés par table !!
    #1069 - Trop de clefs sont définies. Maximum de 64 clefs alloué

    Conclusion : on peut pas utiliser une seule table pour gérer une matrice 3d de 24 champs !!

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Conclusion : on peut pas utiliser une seule table pour gérer une matrice 3d de 24 champs !!
    Cela dépend sûrement de ta modélisation
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    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 847
    Points : 52 948
    Points
    52 948
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par clavier12AZQSWX Voir le message
    Conclusion : on peut pas utiliser une seule table pour gérer une matrice 3d de 24 champs !!
    Une matrice 3 D c'est du spatial. Le problème de MySQmerde c'est qu'il ne ait pas gérer le spatial à 3 dimenion. Même avec 2 dim il donne déjà des résultats faux.

    Dans une cartouche SIG tu peut créer des nuages de points à 3 dimensions : X, Y et Z.... Voir mon cours sur le spatial. Mais les seuls SGBDR qui avent faire ça c'est Oracle, MS SQL Server PG ne gère pas le Y...

    Exemple MS SQL Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @POINTS GEOMETRY = CAST('MULTIPOINT ((25 12 3), (35 11 6))' AS GEOMETRY)
    A me lire : https://blog.developpez.com/sqlpro/p...on_geographiqu

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

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 401
    Points : 19 155
    Points
    19 155
    Par défaut
    Salut à tous.

    j'ai une table avec plus de 40 champs dont 24 ayant besoin d'un index.
    Les habitudes ont la vie dure. Il ne s'agit pas de champs mais de colonnes.
    Pourquoi autant d'index pour une table contenant 40 colonnes ?
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.


    Les habitudes ont la vie dure. Il ne s'agit pas de champs mais de colonnes.
    Pourquoi autant d'index pour une table contenant 40 colonnes ?
    une table qui gère des "produits" à plus de 24 propriétés sélectionnables (donc 24 tables étrangères différentes liées).
    Dans un vieux poste, avant la création du schéma, je m'étais demandé s'il fallait créer une table catégorie "fourtout" où des valeurs numériques serait mélangées à des valeurs AN, pour simplifier le modèle relationnel.
    Contre mon envie personnelle, j'ai donc opté pour la solution de rester "sémantique" et pas aller dans la bidouille. Même si je me suis rapproché du "keep it simple", je reste convaincu que la solution foure-tout aurait été la meilleure...

    Le cas d'étude est simple : comment formaliser un produit à 40 propriétés.
    -1 : Une seule table maitre et 40 tables étrangères pour chacune des propriétés
    - 2 : une table maitre et une table "typologie (id,lib,valeur,typologie) et une table-relation appartenance pour faire le lien.
    Le fait de mélanger dans une seule table des données métrique,date,AN était déconseillée....

    C'est la même question qu'à du se poser l'ingénieur date de site amazon : un table avec chaque type de propriété ou une seule table propriété où l'on mélangerait des données de vêtements avec des données alimentaires avec des données techniques...

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 288
    Points : 39 538
    Points
    39 538
    Billets dans le blog
    9
    Par défaut
    Pour ce qui concerne les recherches, hors considérations d'index couvrant donc, un index n'est pertinent que s'il est discriminant.
    Par exemple, créer un index sur le code sexe d'une table des personnes physiques ne présente aucun intérêt concernant les recherches puisque grosso-modo, chaque valeur représentera 50% de l'effectif de la table.

    Donc, avant de créer un index pour chaque colonne (et non pas "champ") de la table, vérifiez combien de valeurs distinctes chaque colonne peut prendre et quels sont les besoins de recherche sur chaque colonne.

    Il ne faut pas oublier que chaque index impose une mise à jour supplémentaire lors des UPDATE, INSERT et DELETE, puisqu'il faut maintenir non seulement la page DATA et la page de l'index PK, mais aussi tous les autres index.
    Evidement, les servitudes (réorgs, sauvegardes...) sont également pénalisées par la pléthore d'index, ainsi que l'espace disque.

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Aussi, indexer 24 colonnes, c'est bien, mais il est rare que dans une requête, la clause WHERE porte sur une unique valeur, et qu'il ne se balade pas un ORDER BY quelque part.

    Ainsi, il est généralement préférable de créer quelques index composites (limités à 16 colonnes, ce qui est déjà pas mal) plutôt que 24 index mono-colonnes qui n'amélioreront pas significativement les performances dans la plupart des cas.

    Par exemple pour une adresse, on aura les 4 colonnes villes/cp/rue/numéro (et éventuellement pays si on fait de l'international).
    => Ca n'a aucun sens d'indexer les 4 colonnes séparément. en revanche, créer un index sur ville / rue / numéro permettra d'accélérer toutes les recherches qui portent sur la ville, sur ville et rue, ainsi que ville, rue et numéro. CP ici ne sera pas indexé, ou alors il y aura un second index qui remplace ville par cp... le mieux étant d'avoir les villes + cp dans une table séparée, et à ce moment on n'a qu'une clé étrangère à indexer.
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 089
    Points : 9 471
    Points
    9 471
    Par défaut
    Si demain l'utilisateur veut ajouter une 41ème propriété, il doit donc faire appel à l'informaticien, qui va modifier les structures des tables et modifier les programmes ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Si demain l'utilisateur veut ajouter une 41ème propriété, il doit donc faire appel à l'informaticien, qui va modifier les structures des tables et modifier les programmes ?

    Dans mon cas, sans trop dévoiler le projet, j'étais dans un système métrique fini à 24 unités (24 créneaux horaires), donc à moins qu'on invente la 25eme heure, ce n'est pas prêt d'arriver !

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 288
    Points : 39 538
    Points
    39 538
    Billets dans le blog
    9
    Par défaut
    Quoi qu'il en soit, 24 colonnes indexées est symptomatique d'une erreur de modélisation et sera la source de nombreux inconvénients déjà cités plus haut.

    Plusieurs solutions sont possibles, par exemple une seule colonne heure valorisée de 1 à 24 et un partitionnement des données sur cette colonne.

  13. #13
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 401
    Points : 19 155
    Points
    19 155
    Par défaut
    @ Escartefigue : si j'ai bien compris le problème, il s'agit d'une sélection multicritères.
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 288
    Points : 39 538
    Points
    39 538
    Billets dans le blog
    9
    Par défaut
    Selon le cas de figure, on peut soit utiliser l'héritage, soit un méta-modèle, soit une combinaison des deux.

    Cf. § pertinence des caractéristiques pour un type d'entité dans ce tuto
    https://merise.developpez.com/faq/?p...eVariablePptes

  15. #15
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 773
    Points : 1 483
    Points
    1 483
    Par défaut
    Citation Envoyé par clavier12AZQSWX Voir le message
    une table qui gère des "produits" à plus de 24 propriétés sélectionnables (donc 24 tables étrangères différentes liées).
    Le fait qu'il y ait 24 propriétés n'implique pas qu'il y ait des tables "étrangères différentes liées" !

    Une propriété est normalement associée à un scalaire.
    De ce que je comprends, la fameuse table produit serait associable à 24 classes de propriétés.
    Du coup c'est la table produits qui serait une table "fourretout".

    Peux tu nous en dire plus sur ton besoin réel ?

    J'ai bien peur que ton modèle va imposer des outer join à tire larigot et poser très rapidement des problèmes de performances.
    Surtout si un produit ne relève, au final, que d'une seule classe à la fois.
    Le savoir est une nourriture qui exige des efforts.

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    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 847
    Points : 52 948
    Points
    52 948
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par clavier12AZQSWX Voir le message
    Dans mon cas, sans trop dévoiler le projet, j'étais dans un système métrique fini à 24 unités (24 créneaux horaires), donc à moins qu'on invente la 25eme heure, ce n'est pas prêt d'arriver !

    Dans ce cas il faut créer une table de chonodatation avec toutes les dates et une ligne par heure. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREAT TABLE T_CHRONO_CHR 
    (CHR_ID     INT PRIMARY KEY,
     CHR_DATE   DATE NOT NULL,
     CHR_TIME   TIME NOT NULL,
     UNIQUE (CHR_DATE, CHR_TIME));
    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/ * * * * *

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/06/2017, 18h32
  2. Limiter un nombre de table par bases
    Par ApocKalipsS dans le forum Administration
    Réponses: 1
    Dernier message: 01/08/2011, 19h34
  3. Liste des index par tables
    Par Labienus dans le forum Administration
    Réponses: 3
    Dernier message: 20/07/2010, 11h12
  4. recherche sur table mysql avec deux index
    Par Invité1 dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/05/2010, 11h41
  5. [Sybase] Utilisation indexes sur table Proxy
    Par MashiMaro dans le forum Sybase
    Réponses: 2
    Dernier message: 20/02/2004, 10h20

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