Estoy tratando de averiguar los requisitos de almacenamiento para diferentes motores de almacenamiento. Tengo esta tabla:¿Por qué el tamaño de la tabla InnoDB es mucho más grande de lo esperado?
CREATE TABLE `mytest` (
`num1` int(10) unsigned NOT NULL,
KEY `key1` (`num1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Al insertar algunos valores y luego corro show table status;
me sale el siguiente:
+----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | mytest | InnoDB | 10 | Compact | 1932473 | 35 | 67715072 | 0 | 48840704 | 4194304 | NULL | 2010-05-26 11:30:40 | NULL | NULL | latin1_swedish_ci | NULL | | |
Aviso AVG_ROW_LENGTH es 35. Estoy sorprendido de que InnoDB no sería hacer un mejor uso del espacio cuando solo estoy almacenando un entero no nulable.
He ejecutado esta misma prueba en myISAM y de forma predeterminada myISAM utiliza 7 bytes por fila en esta tabla. Cuando ejecuto
ALTER TABLE mytest MAX_ROWS=50000000, AVG_ROW_LENGTH = 4;
hace que myISAM finalmente utilice correctamente filas de 5 bytes.
Cuando ejecuto la misma sentencia ALTER TABLE para InnoDB, avg_row_length no cambia.
¿Por qué un avg_row_length tan grande sería necesario cuando solo se almacena un int sin firmar de 4 bytes?
Acabo de leer que InnoDB usa el tablespace tanto para los datos como para el índice. esto tiene sentido y parece que esta sería la razón por la que estoy viendo una avg_row_length tan grande ... tal vez. También descubrí que cada nodo hoja almacena la identificación de la transacción y el puntero de restitución. Bueno, no estoy haciendo uso de las transacciones per se y por lo tanto no tengo uso para estos datos. ¿Hay alguna forma de no almacenar estos valores? ¿De alguna manera puedo usar InnoDB pero hacer un uso un poco mejor del almacenamiento? gracias! –
@alessandro: sí, el soporte de transacción también agrega algo de sobrecarga. El hecho de que no esté haciendo uso de las transacciones no significa que no se utilicen: por ejemplo, un hilo que muere durante una operación larga de 'ACTUALIZACIÓN' se revertirá correctamente en 'InnoDB' pero no en 'MyISAM'. El soporte de transacción es el objetivo de usar 'InnoDB', si no lo necesita, solo use' MyISAM'. – Quassnoi
@Quassnoi: Tengo la impresión de que MyISAM no está tan "maduro" o preparado para producción como InnoDB ... tal vez sea un miedo infundado. ¿Hay alguna dificultad que MyISAM trae a la mesa cuando se trata de hacer copias de seguridad de las bases de datos además del hecho de que MyISAM requiere un bloqueo de tabla completo para garantizar la coherencia. No requiero transacciones y almacenaré muchos datos. ¿Hay algún problema conocido con MyISAM que pueda causar que no lo use? –