El esquema de la base de datos es el siguiente.
CREATE TABLE `items` (
`id` mediumint( 8 ) unsigned NOT NULL AUTO_INCREMENT ,
`name` varchar( 45 ) NOT NULL ,
`main_type` tinyint( 4 ) NOT NULL ,
`rarity` tinyint( 4 ) NOT NULL ,
`stack_size` smallint( 6 ) NOT NULL ,
`sub_type` tinyint( 4 ) NOT NULL ,
`cost` mediumint( 8 ) unsigned NOT NULL ,
`ilvl` smallint( 6 ) unsigned NOT NULL DEFAULT '0',
`flavor_text` varchar( 250 ) NOT NULL ,
`rlvl` tinyint( 3 ) unsigned NOT NULL ,
`final` tinyint( 4 ) NOT NULL DEFAULT '0',
PRIMARY KEY ( `id` ) ) ENGINE = InnoDB DEFAULT CHARSET = ascii;
Ahora, hacer una inserción en esta tabla toma 0,22 segundos. No sé por qué se tarda tanto en insertar una sola fila. Las lecturas son realmente rápidas, algo así como 0,005 segundos. Con el uso de la configuración de ejemplo desde aquídesarrollador mysql innodbtiene un promedio de ~0,002 a ~0,005 segundos. No tiene sentido para mí por qué se necesita más de 100 veces más tiempo para hacer una sola inserción. Mi computadora es la siguiente. Sistema operativo: Debian Sid x86-x64, Mysql 5.1, RAM: 4 GB ddr2, CPU de doble núcleo a 2,0 Ghz, disco duro de 7200 RPM, caché de 32 MB y 640 GB.
¿Por qué se necesita casi 100 veces más tiempo para un SELECT * FROM items
; frente a INSERTAR EN items
...; Nunca tendrá ningún sentido para mí. Sigue siendo una tabla pequeña con solo 70 filas y tomó ese tiempo incluso cuando tenía 0 filas.
Editar: Además, esta tabla tiene bastantes otras tablas vinculadas a sí misma a través de la identificación. Hay algunos de ellos que están vinculados a él y realizan una actualización = cascada; en eliminar = cascada;. Creo que ese es el mayor problema aquí. Si es así, probablemente pueda entrar, cambiarlo y realizar eliminaciones individuales de las diversas pequeñas cosas cuando se eliminen. La velocidad de inserción parece ser de ~0,2 segundos, ya sea que esté insertando solo items
o también en otra tabla que tenga un enlace de clave externa a la principal.
Respuesta1
Bueno, mi primera suposición es que tu InnoDB probablemente esté roto. Puedes comprobar si no hay ninguno.
- disparadores que harían una operación lenta al insertar
- procesos en curso que bloquearían la mesa
- claves externas/restricciones que apuntan a esta tabla
La mejor manera de auditar completamente una base de datos contra cualquier cosa que pueda causar tales problemas es leer el volcado de esquemas desde el comando mysqldump.