2011-01-29 9 views
12

Tengo la siguiente tabla InnoDB:Mysql Inserte lenta

+-----------+-----------+------+-----+-------------------+----------------+ 
| Field  | Type  | Null | Key | Default   | Extra   | 
+-----------+-----------+------+-----+-------------------+----------------+ 
| id  | int(11) | NO | PRI | NULL    | auto_increment | 
| doc_id | char(32) | NO |  | NULL    |    | 
| staff  | char(18) | NO |  | NULL    |    | 
| timestamp | timestamp | NO | MUL | CURRENT_TIMESTAMP |    | 
+-----------+-----------+------+-----+-------------------+----------------+ 

Con estas teclas:

+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table  | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| staff_online |   0 | PRIMARY   |   1 | id   | A   |  277350 |  NULL | NULL |  | BTREE  |   | 
| staff_online |   1 | timestamp  |   1 | timestamp | A   |  277350 |  NULL | NULL |  | BTREE  |   | 
| staff_online |   1 | staff_timestamp |   1 | timestamp | A   |  277350 |  NULL | NULL |  | BTREE  |   | 
| staff_online |   1 | staff_timestamp |   2 | staff  | A   |  277350 |  NULL | NULL |  | BTREE  |   | 
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 

Acabo de notar que in mysql-slow.log a veces tengo una consulta INSERT en esta tabla que tiene más de 1 segundo

INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54') 

Estoy realmente desconcertado por qué lleva tanto tiempo. ¿Cómo puedo acelerarlo?

BTW: Cada día hay ~ 80 INSERTOS lentos y 40 ACTUALIZACIONES lentas como esta.

+1

¿Cuántas filas hay en la tabla y está seguro de que todas las inserciones son lentas? –

+1

Hay 277259 filas y solo algunas inserciones son lentas (raras). – kalkin

+7

Parece que tiene dos índices, uno por 'timestamp' y otro por' timestamp, staff'. Este último es suficiente para buscar por 'timestamp', puede descartar el primero. – 9000

Respuesta

10

En ocasiones, no es la consulta en sí misma la que causa una desaceleración: otra consulta que opera en la tabla puede hacer que las inserciones se ralenticen debido al aislamiento y bloqueo transaccional. Es posible que sus consultas lentas hayan estado esperando que se complete otra transacción. Esto es bastante común en una tabla ocupada, o si su servidor está ejecutando transacciones largas/complejas.

Otro factor importante será el rendimiento general de su base de datos: cómo se sintoniza su archivo my.cnf, cómo se sintoniza el servidor, qué más tiene el servidor ejecutándose y, por supuesto, qué hardware está ejecutando el servidor.

La herramienta de Linux mytop y la consulta SHOW ENGINE INNODB STATUS\G pueden ser útiles para ver posibles puntos problemáticos. Las herramientas generales de rendimiento de Linux también pueden mostrar qué tan ocupados están sus discos, etc.

Dada la naturaleza de esta tabla, ¿ha considerado una forma alternativa de realizar un seguimiento de quién está en línea? En MySQL, he usado una tabla MEMORY para tales fines en el pasado. Un almacén de datos NoSQL también podría ser bueno para este tipo de información. Redis podría almacenar esto como un conjunto ordenado con mucho éxito (puntuación == marca de tiempo).

Más información:

+1

Agregué lo siguiente a mi configuración de mysql, debería obtener un mayor rendimiento. Veremos. innodb_flush_log_at_trx_commit = 0 innodb_support_xa = 0 innodb_buffer_pool_size = 536870912 – kalkin

+0

Btw no puedo usar el motor de memoria, porque necesito tener los datos en línea de alguna manera persistente, para su posterior análisis. – kalkin

+0

@Kalkin: Eso me parece una excusa: "los requisitos del negocio lo exigen". En ocasiones, los requisitos comerciales demasiado amplios deben ser reevaluados a pesar de los obstáculos técnicos. Te aconsejé que volvieras a pensar en tus requisitos en función de lo que realmente necesitas saber. Pero, en general, mi mensaje es sobre: ​​no solo mire esta consulta, mire todo lo que está haciendo su base de datos. No sabemos qué es eso, así que solo podemos ayudar mucho. – wuputah

4

Si está insertando en una mesa con ráfagas grandes y densas, es posible que tenga que dedicar algún tiempo a la limpieza, p. para asignar más espacio para la tabla y los índices.

Si no desea que su aplicación espere, intente utilizar INSERT DELAYED, aunque tiene sus desventajas.

+4

INSERTAR RETRASADO parece ser una buena solución para el problema, pero no funciona en InnoDB :( – kalkin

+0

También está en desuso en 5.6.6 y eliminado en 5.7. – TJChambers

12

Hay 277259 filas y sólo algunos insertos son lentos (raro)

Cada vez que una página B-Tree está llena, es preciso dividir la cual lleva algún tiempo. El rendimiento de inserción también es más lento cuantos más índices tenga, ya que cada inserción actualiza todos los índices. 9000 ya ha indicado correctamente que su índice (marca de tiempo, personal) cubre el índice (indicación de fecha y hora) en el 95% de los casos, en casos muy raros se necesitará un índice de columna única (indicación de fecha y hora) para obtener un mejor rendimiento.

También hay algunas tareas de fondo periódicas que ocasionalmente pueden ralentizar una o dos inserciones en el transcurso de un día.

Además, otra razón para las demoras es simplemente la actividad de la base de datos. Si tiene transacciones que bloquean páginas que la inserción necesita actualizar (o división de página), la inserción debe esperar hasta que se acepten los bloqueos de escritura. Esta otra actividad ni siquiera necesita iniciar una transacción, y ni siquiera tienen que ser contención de lectura leída; también puede tener contención de escritura-escritura o una cola creada a partir de una actividad intensa.

Y la última razón posible: su servidor de base de datos no tiene recursos, ya sea memoria o CPU o red de E/S. Hay mucho que un servidor puede hacer, por lo que tendrá que esperar hasta que tenga suficientes recursos.

+0

I bajamos el índice de la marca de tiempo. Veremos si las inserciones lentas se desvanecerán ... – kalkin

+0

@kalkin - es un factor como se indicó anteriormente, pero no el * único * uno. Quitarlo solo * no * hará que desaparezcan los insertos lentos, pero ciertamente es una buena idea. Los motores de almacenamiento como InnoDB tienen tareas de fondo que pueden ralentizar periódicamente una o dos inserciones. Otros factores como copias de seguridad automáticas (MySQL), instantáneas de imagen completa (copia de seguridad del servidor), división de páginas, etc. – RichardTheKiwi

+0

La mayoría de los retrasos de inserción son cuando hay mucho tráfico en nuestra "hora pico" en la página. – kalkin

1

Si le sucede a estar de vuelta nivel sobre la instalación de MySQL, nos dimos cuenta de una gran cantidad de ese tipo de lentitud cuando se usa la versión 4.1.

Cuestiones relacionadas