2012-01-02 20 views
12

tengo un problema con mi base de datos actual con mysql.no se puede actualizar el registro, atascado

tengo más de 100 conexiones esperando en un registro selecto. cuando ejecuto:

show processlist; 

la consulta de selección es una consulta grande y las otras son pequeñas consultas e inserciones, actualizaciones.

tengo una base de datos con 100 tablas y la selección está utilizando 5 uniones.

¿Hay alguna manera de detener temporalmente el proceso y dejar que se ejecuten los otros procesos, una vez que se completen todos los procesos, entonces la selección puede continuar ejecutándose?

+1

EXPLIQUE su consulta, tal vez tenga problemas de índice –

+0

¿Cómo puede, por ejemplo, esperar un INSERT en un SELECTO? No quiero creer que ningún servidor SQL moderno bien configurado pueda exhibir este error ... –

+1

@ PéterVarga: en 'MyISAM', las lecturas pueden bloquear escrituras (y viceversa). – Quassnoi

Respuesta

12

recomendaré dejar que la consulta haga lo que necesita hacer, si detiene cualquiera o elimina procesos o consultas puede que tenga errores de integridad de datos que pueden conducir a errores importantes.

BookOfZeus y tfb785 tienen razón, antes que nada es probable que tenga errores de índice. la explicación le dirá cuál es exactamente el problema y qué buscar. por ejemplo, si tiene 5 uniones y obtiene recuentos de filas como, 100.000 y 100 y 1 y 1 y 1, obtendrá múltiples 100.000 * 100, que pueden ser súper lentos.

lea atentamente lo que explica explicar y optimice su consulta en función de ello.

innodb puede ser una buena opción si se accede a las tablas muy a menudo porque su bloqueo de fila insted de bloqueo de tabla para myisam.

Diría que primero intenta optimizar su consulta, tal vez no necesite modificar el motor de la tabla para solucionar el problema. si todavía tiene problemas, entonces podría considerar mudarse a innodb.

+0

déjeme revisar lo que tengo –

+0

oh f ** k tiene razón, tengo: 1,314,145 en 1 tabla, 1,292 en una segunda tabla, 11 en una 3ra mesa y el resto son 1. entonces significa 1.314,145 * 1292 * 11 * 1 * 1? –

+0

ese es su problema, asegúrese de que los índices sean buenos y que las claves sean (pk, key y fk) están configurados correctamente. –

4

¿Existe una manera de detener temporalmente el proceso y dejar que los demás procesos se ejecutan, una vez que todos los procesos se han completado, entonces la selección puede seguir funcionando?

Creo que está utilizando MyISAM como un motor de almacenamiento.

En MyISAM, las consultas de lectura bloquean las consultas de escritura concurrentes. Esto garantiza que las escrituras no cambien los datos en proceso y que no obtenga la mitad de su conjunto de registros actualizado y otra mitad no actualizada.

No hay forma de detener la consulta SELECT de la forma en que pregunta: las escrituras podrían hacer que el conjunto de registros devuelva inconsistencia. Si bien puede no ser el caso real en su configuración y teóricamente las escrituras podrían no afectar las lecturas (digamos, diferentes registros son leídos y escritos), MyISAM no es consciente de eso y siempre bloquea tablas enteras, por las dudas.

Si necesita escribir para no bloquear las lecturas, cambie a InnoDB (aunque hay casos en que las escrituras también bloquean las lecturas).

4

No puede detener la consulta en ejecución y dar tiempo a las otras consultas. Pero hay tres maneras de resolver su problema:

Primera forma: cambiar el nivel de aislamiento http://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html Estos también puede significar que usted tiene que cambiar su motor de almacenamiento por ejemplo. a InnoDB.

Segunda manera: Intente acelerar su larga carrera seleccione con índices. Esto es un llamado intercambio de memoria de tiempo. Aumenta la velocidad de su consulta con más memoria para mantener los árboles de índices.

Tercera forma: Acelere su larga ejecución seleccione con la reorganización de la consulta (se une y selecciona). Analiza el costo de todas las partes de la consulta.

Cuestiones relacionadas