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 :

Fonctionnement interne : Comment MySQL insèrent des données avec des index ?


Sujet :

Requêtes MySQL

  1. #1
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut Fonctionnement interne : Comment MySQL insèrent des données avec des index ?
    J'ai un petit soucis...
    J'insère des données de la table A vers sa copie conforme, la table 2. Cette table est pourvu de deux index dont la clef primaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `test` (
      `id` bigint(20) unsigned NOT NULL auto_increment,
      `lib` varchar(255) default NULL,
      PRIMARY KEY  (`id`),
      KEY `lib` (`lib`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    Je copie les données de l'une des tables vers l'autre pour des tests d'optimisation. (La lenteur de la copie de table de 65Mo m'inquiète en fait)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into test2 select * from test;
    Comme les tables sont transactionnelles (InnoDb) je ne peux savoir où j'en suis avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM test2
    Car la réponse est logiquement zéro.

    Et je me suis demandé ce qu'il se passait en interrogeant le schéma d'informations. Je l'ai lancé une dizaine de fois, les résultats sont abhérrants! Je vous laisse regarder :
    mysql> select * from information_schema.tables
    -> where table_name='test2'
    -> \G
    *************************** 1. row ***************************
    TABLE_CATALOG: NULL
    TABLE_SCHEMA: test
    TABLE_NAME: test2
    TABLE_TYPE: BASE TABLE
    ENGINE: InnoDB
    VERSION: 10
    ROW_FORMAT: Compact
    TABLE_ROWS: 473168
    AVG_ROW_LENGTH: 74
    DATA_LENGTH: 35209216
    MAX_DATA_LENGTH: 0
    INDEX_LENGTH: 14221312
    DATA_FREE: 0
    AUTO_INCREMENT: NULL
    CREATE_TIME: 2006-12-29 13:02:11
    UPDATE_TIME: NULL
    CHECK_TIME: NULL
    TABLE_COLLATION: latin1_swedish_ci
    CHECKSUM: NULL
    CREATE_OPTIONS:
    TABLE_COMMENT: InnoDB free: 56320 kB
    1 row in set (1.03 sec)

    mysql> select * from information_schema.tables
    -> where table_name='test2'
    -> \G
    *************************** 1. row ***************************
    TABLE_CATALOG: NULL
    TABLE_SCHEMA: test
    TABLE_NAME: test2
    TABLE_TYPE: BASE TABLE
    ENGINE: InnoDB
    VERSION: 10
    ROW_FORMAT: Compact
    TABLE_ROWS: 514558
    AVG_ROW_LENGTH: 68
    DATA_LENGTH: 35209216
    MAX_DATA_LENGTH: 0
    INDEX_LENGTH: 14221312
    DATA_FREE: 0
    AUTO_INCREMENT: NULL
    CREATE_TIME: 2006-12-29 13:02:11
    UPDATE_TIME: NULL
    CHECK_TIME: NULL
    TABLE_COLLATION: latin1_swedish_ci
    CHECKSUM: NULL
    CREATE_OPTIONS:
    TABLE_COMMENT: InnoDB free: 56320 kB
    1 row in set (0.42 sec)

    mysql> select * from information_schema.tables
    -> where table_name='test2'
    -> \G
    *************************** 1. row ***************************
    TABLE_CATALOG: NULL
    TABLE_SCHEMA: test
    TABLE_NAME: test2
    TABLE_TYPE: BASE TABLE
    ENGINE: InnoDB
    VERSION: 10
    ROW_FORMAT: Compact
    TABLE_ROWS: 336482
    AVG_ROW_LENGTH: 104
    DATA_LENGTH: 35209216
    MAX_DATA_LENGTH: 0
    INDEX_LENGTH: 14221312
    DATA_FREE: 0
    AUTO_INCREMENT: NULL
    CREATE_TIME: 2006-12-29 13:02:11
    UPDATE_TIME: NULL
    CHECK_TIME: NULL
    TABLE_COLLATION: latin1_swedish_ci
    CHECKSUM: NULL
    CREATE_OPTIONS:
    TABLE_COMMENT: InnoDB free: 56320 kB
    1 row in set (0.58 sec)
    Regardez le nombre de lignes ! il ne grimpe pas il bouge dans tous les sens !!! Là je ne comprends pas ce qui se passe en interne !
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Comme les tables sont transactionnelles (InnoDb) je ne peux savoir où j'en suis avec un
    Code :
     
    SELECT count(*) FROM test2
     
    Car la réponse est logiquement zéro.
    ça devrait marcher si tu abaisses le niveau d'isolation des transactions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Oui en effet, je n'y ai pas pensé. En tout cas la vue à quelques soucis. D'après ce que j'ai lu c'est au niveau du raffraichissement des statistiques interne du serveur (c'est la logique de l'optimisation en somme). Merci pour le niveau d'isolation, je n'y avais pas pensé !
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/07/2012, 10h12
  2. Réponses: 1
    Dernier message: 27/11/2008, 19h00
  3. Réponses: 4
    Dernier message: 02/04/2008, 18h51
  4. Alimenter des slides avec des données d'Access
    Par kimmy dans le forum Powerpoint
    Réponses: 1
    Dernier message: 26/06/2007, 11h44
  5. [Tableaux] Trier des données avec des tableaux
    Par yobogs dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2006, 14h39

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