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:
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:
insert into test2 select * from test;
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.
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 :
Citation:
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 !