Inserciones concurrentes en tablas MyISAM de Mysql

Mysql soporta la inserción de registros en una tabla con engine MyISAM al mismo tiempo que se realizan consultas sobre la misma. Es decir, se pueden ejecutar sentencias SELECT mientras se están concretando sentencias INSERT. En un principio esto parece ser muy bueno pero tenemos que tener algunas consideraciones.

Existe una variable de configuración que controla este comportamiento: concurrent_insert. La misma puede tomar los siguientes valores a partir de Mysql 5.5.3 (entre paréntesis se indica el valor correspondiente en versiones previas):

  • NEVER (0): desactiva los INSERTs concurrentes
  • AUTO (1): activa los INSERTs concurrentes solamente para las tablas MyISAM no tengan huecos.
    • Cuando los huecos de una tabla se completan, se vuelven a activar las inserciones concurrentes en esa tabla.
    • Es el valor por defecto.
  • ALWAYS (2): activa los INSERTs concurrentes para TODAS las tablas MyISAM (aunque tengan huecos).
    • Si la tabla tiene huecos y está siendo utilizada por otro proceso (thread), las filas nuevas se agregan al final de la tabla.
    • De lo contrario, se lockea la tabla y se intenta llenar los huecos.

Ejemplo

mysql> SELECT @@GLOBAL.concurrent_insert;

-> AUTO

Además, los resultados de las inserciones podrían no ser visibles instantáneamente, dado que si existen muchas se encolan y se tratan secuencialmente, en simultaneidad con las consultas.

Basado en:

http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.htm

Tagged with: , , ,
Publicado en Aplicaciones