Estoy tratando de obtener una mejor comprensión sobre la velocidad de inserción y los patrones de rendimiento en mysql para un producto personalizado. Tengo dos tablas a las que agrego nuevas filas. Las dos tablas se definen de la siguiente manera:Desaceleración de la velocidad de inserción a medida que la tabla crece en mysql
CREATE TABLE events (
added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id BINARY(16) NOT NULL,
body MEDIUMBLOB,
UNIQUE KEY (id)) ENGINE InnoDB;
CREATE TABLE index_fpid (
fpid VARCHAR(255) NOT NULL,
event_id BINARY(16) NOT NULL UNIQUE,
PRIMARY KEY (fpid, event_id)) ENGINE InnoDB;
y guardo la inserción de nuevos objetos a ambas tablas (para cada nuevo objeto, i insertar la información relevante para ambas tablas en una sola transacción). Al principio, obtengo alrededor de 600 inserciones/seg, pero después de ~ 30000 filas, obtengo una desaceleración significativa (alrededor de 200 inserciones/seg), y luego una desaceleración más lenta, pero aún notable.
Veo que a medida que la tabla crece, los números de espera de IO se vuelven cada vez más altos. Mi primer pensamiento fue la memoria tomada por el índice, pero esos se hacen en una máquina virtual que tiene 768 Mb, y está dedicada a esta tarea sola (2/3 de memoria no se utilizan). Además, tengo dificultades para ver 30000 filas que toman tanta memoria, incluso más los índices (todo el directorio de datos mysql < 100 Mb de todos modos). Para confirmar esto, asigné muy poca memoria a la VM (64 Mb), y el patrón de desaceleración es casi idéntico (es decir, aparece la disminución después de la misma cantidad de inserciones), así que sospecho algunos problemas de configuración, especialmente porque soy relativamente nuevo bases de datos.
El patrón se ve de la siguiente manera:
Tengo un script en Python autónomo que reproduce el problema, que pueda poner a disposición si eso es útil.
Configuración:
- Ubuntu 10.04, 32 bits que se ejecutan en KVM, 760 Mb que se le asignen.
- MySQL 5.1, fuera de la configuración de la caja con los archivos separados para las tablas
[EDIT]
muchas gracias a Eric Holmberg, que clavó. Aquí están los gráficos después de reparar el innodb_buffer_pool_size a un valor razonable:
El problema es la posibilidad de escribir en el disco, virtual o no. –
No estoy seguro de entender lo que quiere decir: entiendo que lleva tiempo escribir en el disco, pero eso no explica la desaceleración a medida que la mesa crece. –