Usted preguntó " ¿por qué esto está tomando tanto tiempo ?". También dijo " Desafortunadamente, esto tardó más de 5 segundos en recuperar los datos y mostrármelos ". Además, informó el resultado del perfil de su consulta.
Como puede ver, la suma de los tiempos reportados por el generador de perfiles para cada paso cuenta hasta 0.000154 segundos. Entonces, desde el punto de vista del generador de perfiles, la consulta se completó en ese momento (0.000154).
Entonces, ¿por qué está obteniendo resultados en " ... más de 5 segundos? ".
Dijiste que estás filtrando una tabla de registro de 23 millones con un campo de 3 caracteres. Desafortunadamente, no nos dice cuántos registros está devolviendo su consulta ... pero gracias al EXPLAIN SELECT proporcionado, parece que su consulta devolvió 336052 registros.
Parece, también, que toda su actividad se ejecuta a través de alguna GUI (PHPMyAdmin?).
Entonces, después de todo lo anterior, podemos reformular su pregunta original como:
"¿por qué obtengo, dentro de mi GUI, 336.052 registros que se muestran en más de 5 segundos, si el tiempo de ejecución de MySQL para la consulta relacionada es 0.000154 segundos?"
La respuesta, en mi opinión, es bastante simple: 5 segundos es el tiempo (realmente bajo) para permitir que 336.052 registros viajen a lo largo del camino: motor MySQL => bibliotecas cliente MySQL => módulo PHP MySQL => Apache => red = > su PC TCP / IP stack => Browser => DOM parser / builder / etc. => Página HTML representada.
En cuanto a mi experiencia previa, el tiempo requerido por la transmisión de resultados es "normalmente" mucho mayor que el tiempo necesario para recuperar dichos datos. Esto es especialmente cierto cuando las bibliotecas como PHP-MySQL o Perl-DBD-MySQL están involucradas: realmente requieren mucho tiempo para recuperar los registros, después de MySQL los haya identificado (... y extraído) correctamente.
¿Cómo resolver este problema?
De nuevo, con bastante facilidad: ¿está realmente seguro de que necesita TODO el registro 336.052, en un único conjunto de datos completo?
Si su respuesta es realmente "¡SÍ! Los necesito a todos", entonces su aplicación manejará la PAGINACIÓN y / o la Interacción del USUARIO por sí misma y ... una vez que haya reunido todos esos datos, probablemente pasará mucho tiempo interactuando con el usuario sin requerir ninguna interacción adicional de MySQL. En tal caso, esperar 5 segundos (o incluso más) no debería ser un problema;
Si su respuesta es "NO, quiero tratar con un tamaño de conjunto de datos más" humano ", de lo que debe refinar su consulta (al menos) para que le devuelva un conjunto de datos más" humano "(decenas o, cientos, como máximo, registros). En tal caso, apuesto a que obtendrá su resultado en un tiempo más corto.
Por cierto: este es exactamente el mismo problema que experimentó en esta otra publicación , en ServerFault: 88 segundos para permitir que 132M registros viajen a lo largo de ... la ruta mágica no estrictamente relacionada con mysql :-)