Una de mis consultas en MySQL 5.0.45 está funcionando lento en el "envío de datos" fase. La consulta es una selección simple, devuelve aproximadamente 300 campos de ID de enteros como conjunto de resultados.MySql - Envío lenta fase de datos
mysql> SELECT source_id FROM directions WHERE (destination_id = 10); +-----------+ | source_id | +-----------+ | 2 | | 8 | ... | 2563 | +-----------+ 341 rows in set (2.13 sec)
estoy seguro de por qué se tenga en cuenta "envío de datos" fase tan lento y qué se puede hacer para que sea rápido. Tenga en cuenta que estoy ejecutando esta consulta en el indicador de MySQL en el servidor, por lo que realmente no espero que pase tanto tiempo "enviando datos". ¿Alguna pista?
Si ayuda, tengo 3 campos de texto en esta tabla, pero dado que no están siendo seleccionados, que espero que no son motivo de esta lentitud.
Esta consulta se ejecuta miles de veces al día y realmente no puede permitirse el lujo de pasar 2 segundos en él cada vez.
resultado de perfiles:
mysql> show profile for query 4; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | (initialization) | 0.000003 | | checking query cache for query | 0.000051 | | checking permissions | 0.000007 | | Opening tables | 0.000011 | | System lock | 0.000005 | | Table lock | 0.000023 | | init | 0.00002 | | optimizing | 0.00001 | | statistics | 0.00006 | | preparing | 0.000014 | | executing | 0.000005 | | Sending data | 2.127019 | | end | 0.000015 | | query end | 0.000004 | | storing result in query cache | 0.000039 | | freeing items | 0.000011 | | closing tables | 0.000007 | | logging slow query | 0.000047 | +--------------------------------+----------+ 18 rows in set (0.00 sec)
ACTUALIZACIÓN: He tropezó con la siguiente URL que dice
Each time means the time elapsed between the previous event and the new event. So, the line: | Sending data | 0.00016800 | means that 0.00016800 seconds elapsed between "executing" and "Sending data". It is, it takes 0.00016800 seconds to execute the query.
http://forums.mysql.com/read.php?24,241461,242012#msg-242012
Puede alguien validar?
La declaración no es cierto en la página enlazada. Si hace un 'SHOW PROCESSLIST' mientras la consulta se está ejecutando, mostrará que la consulta está en el estado ** Enviando datos **. (No en el anterior). - Y por favor, nadie dice que la lista de procesos muestra el * siguiente * paso en la ejecución. :) – vbence
@vbence: ¿Alguna vez has visto una consulta que nos lleva más de unos pocos a ejecutar? La teoría anterior tiene sentido. –
@ user9111337 Oh sí. Las sentencias agregadas (GROUP BY) con WHERE caluse generalmente darán como resultado selecciones que no pueden ser resueltas usando un índice (EXPLAIN ... dirá "USING WHERE") - si la tabla es lo suficientemente grande, esto puede llevar varios minutos. - ¿Cómo se informa esto? Puedes verlo por ti mismo probando un 'SHOW PROCESSLIST'. – vbence