Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] mysql muy lento

Estas en el tema de mysql muy lento en el foro de Mysql en Foros del Web. Buenas tengo una duda estoy trabajando sobre una base de datos mysql con cerca de 2 millones de registros, el servidor es un ubuntu petium ...
  #1 (permalink)  
Antiguo 12/08/2013, 09:54
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
mysql muy lento

Buenas tengo una duda estoy trabajando sobre una base de datos mysql con cerca de 2 millones de registros, el servidor es un ubuntu petium 4 con 1.5gb de ram al momento de hacer alguna query tarda mas de la cuenta.

los campos son todos varchar, exepto el id que es int.

Ejemplo

Código MySQL:
Ver original
  1. mysql> select count(*) from textos;
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. |  2291060 |
  6. +----------+
  7. 1 row in set (19,23 sec)

suele tardar un poco mas, pero al realizar un query esto me da

Código MySQL:
Ver original
  1. mysql> select * from texto where texto = 'hola' limit 1;
  2.  
  3. 1 row in set (40,66 sec)

Es normal que sea tan lento con un servidor de este tipo?
No estoy seguro si coloque toda la informacion correspondiente para esto.

Saludos!
__________________
..
  #2 (permalink)  
Antiguo 12/08/2013, 10:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql muy lento

Si ese campo es un TEXT, o algo semejante, y no está indexado, estás haciendo lo que se denomina "full table scan", que es algo bastante espantoso...
para verificar cómo está realizando la consulta, habría que indicarle a MySQL que muestre el plan de la consulta:
Código MySQL:
Ver original
  1. EXPLAIN SELECT * FROM texto WHERE texto = 'hola' LIMIT 1;
Eso devolverá una tabla con ciertos datos. Postalo acá y veremos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/08/2013, 11:52
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Respuesta: mysql muy lento

Aparte de lo mencionado, un Pentium IV NO es un servidor ni está equipado para trabajar como tal y eso lógicamente también influye.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #4 (permalink)  
Antiguo 13/08/2013, 05:09
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Si ese campo es un TEXT, o algo semejante, y no está indexado, estás haciendo lo que se denomina "full table scan", que es algo bastante espantoso...
para verificar cómo está realizando la consulta, habría que indicarle a MySQL que muestre el plan de la consulta:
Código MySQL:
Ver original
  1. EXPLAIN SELECT * FROM texto WHERE texto = 'hola' LIMIT 1;
Eso devolverá una tabla con ciertos datos. Postalo acá y veremos.
bien esto me aparecio

Código MySQL:
Ver original
  1. mysql> EXPLAIN SELECT * FROM texto WHERE texto = 'hola' LIMIT 1;
  2. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
  4. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  5. |  1 | SIMPLE      | texto   | ALL  | NULL        | NULL | NULL    | NULL | 2300356 | Using where |
  6. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  7. 1 row in set (0,00 sec)
__________________
..
  #5 (permalink)  
Antiguo 13/08/2013, 05:11
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Cita:
Iniciado por BrujoNic Ver Mensaje
Aparte de lo mencionado, un Pentium IV NO es un servidor ni está equipado para trabajar como tal y eso lógicamente también influye.
Si lastimosamente con ese equipo tengo que trabajar, pero lei que mysql no necesita de tanto equipamiento solo necesita hasta 2gb de ram, no se si me estoy equivocando.

De todos modos vi una base de datos con mas de 300 millones de datos y no es tan lento como esta.

Gracias por responder!
__________________
..
  #6 (permalink)  
Antiguo 13/08/2013, 09:08
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Respuesta: mysql muy lento

La RAM, no es lo único que influye. También hay que tomar en cuenta el procesador, velocidad del disco duro, tarjeta de red, cableado, etc.

Soy de las personas que reutilizan equipos viejos pero para cosas más específicas como servidores proxys, de correo o cosas más pequeñas y no una BD donde tiene que interactuar con personas donde los tiempos de respuesta son importantes.

Comienza a crear llaves secundarias o foráneas pero el desempeño sera bueno dependiendo del tipo de campo.

Edito por una confusión...
¿Ese pentium IV tiene instalado Ubuntu Server o Desktop? Eso también influye mucho ya que el server utiliza muchisimo menos recursos que un desktop porque es todo consola y el desempeño es mejor porque tiene más recursos.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL

Última edición por BrujoNic; 13/08/2013 a las 09:23
  #7 (permalink)  
Antiguo 13/08/2013, 09:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql muy lento

Código MySQL:
Ver original
  1. mysql> EXPLAIN SELECT * FROM texto WHERE texto = 'hola' LIMIT 1;
  2. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
  4. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  5. |  1 | SIMPLE      | texto   | ALL  | NULL        | NULL | NULL    | NULL | 2300356 | USING WHERE |
  6. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  7. 1 row IN SET (0,00 sec)
Esto me dice dos cosas: Por un lado, que estás haciendo un FULL TABLE SCAN, lo que resulta espantoso. Eso ocurre porque no existen índices definidos sobre el campo, por lo que debe leer la tabla entera para luego aplicar el WHERE.
Eso resulta muy ineficiente.
Como ya te remarcaron, conviene que generes un INDEX sobre ese campo, pero siendo un TEXT eso puede tener algunas complicaciones, ya que si los textos son demasiado extensos, deberás segmentar la clave del índice creado.
Por otro lado, si las búsquedas son por proximidad, conviene hacerlo con indices FULLTEXT, que son mejores para eso, pero con el inconveniente que sólo se admiten en tablas de tipo MyISAM, y si estás usando InnoDB, no se podrá. Eso a menos que separes el campo en otra tabla, relacionándolo por medio de una FK programada (ya que las MyISAM no tienen FK).

En definitiva, se puede mejorar la performance, usando diversas aproximaciones al problema, más allá de convenir usar un hardware mejor. Pero no te podemos dar consejos avanzados sin conocer mejor el contexto de tu sistema, el tipo de consultas que usas, los datos y la estructura de la base.
Nos falta demasiada info para poder dar un buen diagnóstico.
Respecto a las consultas en si con servidores limitados, es bastante variable. Yo he hecho consultas eficientes con tablas de decenas de millones de registros y más de 1 Gb de peso, usando una notebook con 6 Gb de RAM y sin mayores retrasos. Y también he tenido problemas con consultas de apenas algunos cientos de miles de registros...
Muchas veces se resuelve con mejores consultas e índices. Pero necesitamos saber más para decirlo con certeza.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 13/08/2013, 10:30
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Cita:
Iniciado por BrujoNic Ver Mensaje
La RAM, no es lo único que influye. También hay que tomar en cuenta el procesador, velocidad del disco duro, tarjeta de red, cableado, etc.

Soy de las personas que reutilizan equipos viejos pero para cosas más específicas como servidores proxys, de correo o cosas más pequeñas y no una BD donde tiene que interactuar con personas donde los tiempos de respuesta son importantes.

Comienza a crear llaves secundarias o foráneas pero el desempeño sera bueno dependiendo del tipo de campo.

Edito por una confusión...
¿Ese pentium IV tiene instalado Ubuntu Server o Desktop? Eso también influye mucho ya que el server utiliza muchisimo menos recursos que un desktop porque es todo consola y el desempeño es mejor porque tiene más recursos.
Gracias por responder.
Es un ubuntu desktop
__________________
..
  #9 (permalink)  
Antiguo 13/08/2013, 10:35
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código MySQL:
Ver original
  1. mysql> EXPLAIN SELECT * FROM texto WHERE texto = 'hola' LIMIT 1;
  2. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
  4. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  5. |  1 | SIMPLE      | texto   | ALL  | NULL        | NULL | NULL    | NULL | 2300356 | USING WHERE |
  6. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
  7. 1 row IN SET (0,00 sec)
Esto me dice dos cosas: Por un lado, que estás haciendo un FULL TABLE SCAN, lo que resulta espantoso. Eso ocurre porque no existen índices definidos sobre el campo, por lo que debe leer la tabla entera para luego aplicar el WHERE.
Eso resulta muy ineficiente.
Como ya te remarcaron, conviene que generes un INDEX sobre ese campo, pero siendo un TEXT eso puede tener algunas complicaciones, ya que si los textos son demasiado extensos, deberás segmentar la clave del índice creado.
Por otro lado, si las búsquedas son por proximidad, conviene hacerlo con indices FULLTEXT, que son mejores para eso, pero con el inconveniente que sólo se admiten en tablas de tipo MyISAM, y si estás usando InnoDB, no se podrá. Eso a menos que separes el campo en otra tabla, relacionándolo por medio de una FK programada (ya que las MyISAM no tienen FK).

En definitiva, se puede mejorar la performance, usando diversas aproximaciones al problema, más allá de convenir usar un hardware mejor. Pero no te podemos dar consejos avanzados sin conocer mejor el contexto de tu sistema, el tipo de consultas que usas, los datos y la estructura de la base.
Nos falta demasiada info para poder dar un buen diagnóstico.
Respecto a las consultas en si con servidores limitados, es bastante variable. Yo he hecho consultas eficientes con tablas de decenas de millones de registros y más de 1 Gb de peso, usando una notebook con 6 Gb de RAM y sin mayores retrasos. Y también he tenido problemas con consultas de apenas algunos cientos de miles de registros...
Muchas veces se resuelve con mejores consultas e índices. Pero necesitamos saber más para decirlo con certeza.

Gracias por responder.
Solo 2 usuarios realizan consultas a la base de datos, no se puede utilizar indices ya que se tiene que hacer por condiciones al campo texto que es de tipo text, se podria cambiar a un varchar mas pequeño si influye en tiempo de respuesta.
No indique que el motor es innoDB.
__________________
..
  #10 (permalink)  
Antiguo 13/08/2013, 10:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql muy lento

Cita:
Solo 2 usuarios realizan consultas a la base de datos, no se puede utilizar indices ya que se tiene que hacer por condiciones al campo texto que es de tipo text
¿Qué tiene que ver que sean sólo dos usuarios?
Si la consulta es ineficiente lo será con un sólo usuario, o con mil. Con más lo único que sucede es que la performance empeora.
Por otro lado, si hay condiciones operando sobre ese campo, con más razón debe ser indexado.

¿Puedes explicarme en qué tipos de condiciones, y bajo qué contexto, que no sean inserciones masivas de datos, consideras que un índice es nocivo para una consulta?

Eso es algo que jamás he escuchado. Sería interesante ver un ejemplo de algo así de extraordinario.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 13/08/2013, 10:51
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Qué tiene que ver que sean sólo dos usuarios?
Si la consulta es ineficiente lo será con un sólo usuario, o con mil. Con más lo único que sucede es que la performance empeora.
Por otro lado, si hay condiciones operando sobre ese campo, con más razón debe ser indexado.

¿Puedes explicarme en qué tipos de condiciones, y bajo qué contexto, que no sean inserciones masivas de datos, consideras que un índice es nocivo para una consulta?

Eso es algo que jamás he escuchado. Sería interesante ver un ejemplo de algo así de extraordinario.

Creo que no me doy a entender bien.

Tiene que ser exacta la palabra del where en el campo

Código MySQL:
Ver original
  1. select * from texto where texto = 'hola'

Tampoco entiendo bien el indexado que menciona.
Mil disculpas si empeoro la duda.
__________________
..
  #12 (permalink)  
Antiguo 13/08/2013, 11:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql muy lento



Pues te están faltando fundamentos clave:

- Indices (Bases de Datos)
- CREATE INDEX (MySQL)
- Cómo usa MySQL los índices.

Si no los sabes usar, ponte urgente a aprender, porque esa es la solución para mejorar la performance de tu caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 13/08/2013, 11:13
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Respuesta: mysql muy lento

Estoy de acuerdo, el indexar un campo NO INFLUYE en lo más mínimo si van a buscar todo el contenido del campo indexado o solo una parte.

Resumiendo, un índice se utiliza para realizar búsquedas más rápidas y no secuencialmente hasta llegar al resultado que es mucho más lento.

Los índices son necesario y es bueno que leas lo que te recomendaron ya que es IMPORTANTE.

Yo empezaría cambiando el Ubuntu Desktop por Ubuntu Server y que sea LTS (en este momento sería la 12.04.1).

Lo que recomiendan mucho para el desempeño es desactivarle la búsqueda por DNS y eso lo podrías hacer de 2 formas:
  1. Editando el archivo /etc/my.cnf y agregando al final de la etiqueta [mysqld] skip-name-resolve.
  2. Hacerlo por línea de comando con mysqld -skip-name-resolve.

La otra recomendación, es modificar el tamaño de la cache:

Para chequear la query chache ejecuta:
mysql> SHOW STATUS LIKE ‘Qcache%’;

Para ver el estado de la misma:
mysql> SHOW VARIABLES LIKE ‘%query_cache%’;

Para cambiar el tamaño de la misma:
mysql> SET GLOBAL query_cache_size = 52428800;

Podemos tambien modificar el cache de la misma en el archivo /etc/my.cnf

[mysqld]


query_cache_size = 52428800
query_cache_type = 1
en GNU/Linux

Fuente: Mysql mejorar tiempo respuesta en GNU/Linux
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #14 (permalink)  
Antiguo 13/08/2013, 11:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql muy lento



Excelente aporte.
Copiado para Herramientas y Métodos útiles
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 14/08/2013, 05:13
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Muchas gracias por tomarse el tiempo en responder voy a leer un poco sobre toda la informacion que me pasaron y luego voy a postear los resultados.
__________________
..
  #16 (permalink)  
Antiguo 14/08/2013, 05:16
 
Fecha de Ingreso: octubre-2010
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: mysql muy lento

Por si les hacia la duda nada mas les posteo

Código MySQL:
Ver original
  1. mysql> show status like 'Qcache%'
  2.     -> ;
  3. +-------------------------+-------+
  4. | Variable_name           | Value |
  5. +-------------------------+-------+
  6. | Qcache_free_blocks      | 0     |
  7. | Qcache_free_memory      | 0     |
  8. | Qcache_hits             | 0     |
  9. | Qcache_inserts          | 0     |
  10. | Qcache_lowmem_prunes    | 0     |
  11. | Qcache_not_cached       | 0     |
  12. | Qcache_queries_in_cache | 0     |
  13. | Qcache_total_blocks     | 0     |
  14. +-------------------------+-------+
  15. 8 rows in set (0,10 sec)
  16.  
  17. mysql> show variables like '%query_cache%';
  18. +------------------------------+---------+
  19. | Variable_name                | Value   |
  20. +------------------------------+---------+
  21. | have_query_cache             | YES     |
  22. | query_cache_limit            | 1048576 |
  23. | query_cache_min_res_unit     | 4096    |
  24. | query_cache_size             | 0       |
  25. | query_cache_type             | ON      |
  26. | query_cache_wlock_invalidate | OFF     |
  27. +------------------------------+---------+
  28. 6 rows in set (0,03 sec)
__________________
..
  #17 (permalink)  
Antiguo 14/08/2013, 09:15
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Respuesta: mysql muy lento

La duda de qué????

¿Intentaste lo de los DNS? ¿Le cambiaste el tamaño de la cache?

Simplemente estas mostrando lo que tenes actualmente y de esa forma, no vamos a avanzar nada ya que al parecer, no vas o van a cambiar el Ubuntu Desktop.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL

Etiquetas: campo, lento, registros, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:40.