¿Alguna forma de seleccionar sin causar locking en MySQL?

Consulta:

SELECT COUNT(online.account_id) cnt from online; 

Pero la tabla en línea también se modifica por un evento, por lo que con frecuencia puedo ver el locking ejecutando show processlist .

¿Hay alguna gramática en MySQL que pueda hacer que la instrucción select no cause lockings?

Y he olvidado mencionar que está en una base de datos esclava MySQL.

Después de agregar en my.cnf:transaction-isolation = READ-UNCOMMITTED el esclavo se encontrará con un error:

Error ‘El registro binario no es posible. Mensaje: El nivel de transacción ‘READ-UNCOMMITTED’ en InnoDB no es seguro para el modo de bitácora ‘DECLARACIÓN’ ‘en la consulta

Entonces, ¿hay una forma compatible de hacer esto?

Encontré un artículo titulado “MYSQL WITH NOLOCK”

https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx

en MSSQL harías lo siguiente:

 SELECT * FROM TABLE_NAME WITH (nolock) 

y el equivalente MYSQL es

 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; 

EDITAR

Michael Mior sugirió lo siguiente (a partir de los comentarios)

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; COMMIT ; 

Si la tabla es InnoDB, vea http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html – usa lectura consistente (modo sin locking) para los SELECT “que sí no especifique FOR UPDATE o LOCK IN SHARE MODE si se establece la opción innodb_locks_unsafe_for_binlog y el nivel de aislamiento de la transacción no se establece en SERIALIZABLE. Por lo tanto, no se establecen lockings en las filas leídas de la tabla seleccionada “.

Utilizar

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

Los documentos de la versión 5.0 están aquí .

Los documentos de la versión 5.1 están aquí .

Es posible que desee leer esta página del manual de MySQL. La forma en que se bloquea una tabla depende del tipo de tabla que sea.

MyISAM usa lockings de tabla para lograr una velocidad de lectura muy alta, pero si tiene una instrucción UPDATE en espera, los SELECTS futuros se pondrán en cola detrás de UPDATE.

Las tablas InnoDB usan el locking a nivel de fila, y no tendrá toda la tabla bloqueada detrás de una ACTUALIZACIÓN. Hay otro tipo de problemas de locking asociados con InnoDB, pero es posible que encuentre que se ajusta a sus necesidades.

Dependiendo de su tipo de mesa, el locking funcionará de manera diferente, pero también lo hará un conteo SELECCIONADO. Para las tablas MyISAM, una simple tabla SELECT count (*) FROM no debe bloquear la tabla, ya que accede a metadatos para extraer el recuento de registros. Innodb tomará más tiempo ya que tiene que tomar la mesa en una instantánea para contar los registros, pero no debe causar locking.

Debería al menos tener concurrent_insert establecido en 1 (predeterminado). Luego, si no hay “lagunas” en el archivo de datos para que la tabla se llene, las inserciones se agregarán al archivo y SELECCIONAR e INSERTAR pueden ocurrir simultáneamente con las tablas MyISAM. Tenga en cuenta que eliminar un registro pone un “espacio” en el archivo de datos que intentará llenarse con inserciones y actualizaciones futuras.

Si rara vez borra registros, puede establecer concurrent_insert igual a 2 y las inserciones siempre se agregarán al final del archivo de datos. Luego, las selecciones y las inserciones pueden realizarse simultáneamente, pero su archivo de datos nunca se volverá más pequeño, sin importar cuántos registros elimine (excepto todos los registros).

El resultado final, si tiene muchas actualizaciones, inserta y selecciona en una tabla, debe hacerlo InnoDB. Sin embargo, puedes mezclar libremente tipos de tabla en un sistema.

Los SELECT normalmente no hacen ningún locking que te importe en tablas InnoDB. El nivel de aislamiento de transacción predeterminado significa que las selecciones no bloquean cosas.

Por supuesto, la disputa aún sucede.

De esta referencia:

Si adquiere un locking de tabla explícitamente con LOCK TABLES, puede solicitar un locking de lectura local en lugar de un locking de lectura para permitir que otras sesiones realicen inserciones simultáneas mientras tiene la tabla bloqueada.

Otra forma de habilitar lectura sucia en mysql es agregar pista: BLOQUEO EN MODO COMPARTIR

 SELECT * FROM TABLE_NAME LOCK IN SHARE MODE;