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

[SOLUCIONADO] consulta fulltext bloquea el servidor

Estas en el tema de consulta fulltext bloquea el servidor en el foro de Mysql en Foros del Web. buenas tardes, no he utilizado hasta el momento mysql e intento esta consulta que bloquea el servidor: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT c.clave ...
  #1 (permalink)  
Antiguo 13/05/2014, 12:45
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
consulta fulltext bloquea el servidor

buenas tardes,

no he utilizado hasta el momento mysql e intento esta consulta que bloquea el servidor:

Código MySQL:
Ver original
  1. SELECT c.clave, c.codigo, c.unidad, c.resumen, c.precio, c.fecha, c.tipo, t.texto,
  2. t.texto
  3. )
  4. AGAINST (
  5.  'texto1 texto2 texto3'
  6. ) AS score
  7. FROM tablac AS c
  8. INNER JOIN tablat AS t ON c.codigo = t.codigo
  9. t.texto
  10. )
  11. AGAINST (
  12.  'texto1 texto2 texto3'
  13. )
  14. AND c.codigo LIKE'D_______'
  15. AND c.codigo NOT LIKE'D50_____'
  16. ORDER BY c.codigo, score

Última edición por gnzsoloyo; 14/05/2014 a las 11:29
  #2 (permalink)  
Antiguo 14/05/2014, 11:17
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

buenas tardes,

trato de averiguar si es posible optimizar la consulta, por que tarda casi 1 minuto en ejecutarse.

gracias.

un saludo,
josé carlos.
  #3 (permalink)  
Antiguo 14/05/2014, 11:36
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: consulta fulltext bloquea el servidor

Yo empezaría probando eliminar momentáneamente el ORDER BY, para verificar si eso tiene mal impacto o no. Los ORDER BY y GROUP BY son asesinos de performance, y si se peuden descartar, mejor.
Por otro lado, los LIKE que usas no tienen sentido si no los vas a usar con comodines. Tal como los usas, ponerlo así´:
Código MySQL:
Ver original
  1. ...
  2. AND c.codigo LIKE'D_______'
Es igual que ponerlo así:
Código MySQL:
Ver original
  1. ...
  2. AND c.codigo = 'D_______'
Además, si ese fuese el caso, el NOT LIKE es totalmente innecesario, porque estás operando sobre el mismo campo, por lo que la primera condición descarta la segunda. Es una comparación innecesaria.
Pruébalo así y dinos cuánto tiempo tarda de este modo:
Código MySQL:
Ver original
  1. SELECT c.clave, c.codigo, c.unidad, c.resumen, c.precio, c.fecha, c.tipo, t.texto,
  2. MATCH (t.texto) AGAINST ('texto1 texto2 texto3') score
  3. FROM tablac AS c
  4.   INNER JOIN tablat AS t ON c.codigo = t.codigo
  5.   MATCH (t.texto) AGAINST ('texto1 texto2 texto3')
  6. AND c.codigo = 'D_______'
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 14/05/2014, 11:51
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

hola, gracias por responder

Código MySQL:
Ver original
  1. AND c.codigo LIKE 'D_______'
  2. AND c.codigo NOT LIKE 'D50_____'

estas condiciones LIKE son para que la consulta devuelva solo los registros que:
1. comiencen por D y tengan 7 caracteres más, utilizando el carácter comodín "_"
2. y que no comiencen por D59 y tengan 5 caracteres más.

Código MySQL:
Ver original 

necesito ordenar por la relevancia de la búsqueda, de mayor a menor.


todos los elementos del select lo veo necesarios pero no sabría si se puede optimizar o es cosa del rendimiento del servidor.

un saludo,
josé carlos.
  #5 (permalink)  
Antiguo 14/05/2014, 11:55
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: consulta fulltext bloquea el servidor

Estamos primero viendo el problema de la performance. Por eso te pido que pruebes sin el ORDER BY.
La idea es verificar si el impacto es grande. SI no hay diferencia de performance significativa, significaría que el problema son las condiciones de la consulta, y no el ordenamiento.

Lo que pretendo que hagas es hacer un análisis exhaustivo y detallado de las causas de la baja performance. En este punto no me importa cuál es el ordenamiento final, eso se resuelve después.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/05/2014, 12:07
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

bien, procedemos, la consulta inicial ejecutada es esta y el resultado:

Mostrando registros 0 - 39 (40 total, La consulta tardó 56.9137 seg):

Código MySQL:
Ver original
  1. SELECT c.clave, c.codigo, c.unidad, c.resumen, c.precio, c.fecha, c.tipo, t.texto,
  2. MATCH (t.texto) AGAINST ('texto1 texto2 texto3') AS score
  3. FROM precioc AS c
  4. INNER JOIN preciot AS t ON c.codigo = t.codigo
  5. MATCH (t.texto)
  6. AGAINST ('texto1 texto2 texto3')
  7. AND c.codigo LIKE'D_______'
  8. AND c.codigo NOT LIKE'D50_____'
  9. ORDER BY score


sin ordenación Mostrando registros 0 - 39 (40 total, La consulta tardó 5.0002 seg)

ha bajado de forma considerable, pero es todavía nada operativa.

¿alguna sugerencia?

un saludo,
josé carlos.
  #7 (permalink)  
Antiguo 14/05/2014, 12:11
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: consulta fulltext bloquea el servidor

Cita:
¿alguna sugerencia?


Una, si quieres intentarla... dos queries:

Código MySQL:
Ver original
  1. SELECT c.clave, c.codigo, c.unidad, c.resumen, c.precio, c.fecha, c.tipo, t.texto,
  2. MATCH (t.texto) AGAINST ('texto1 texto2 texto3') AS score
  3. FROM precioc AS c
  4. INNER JOIN preciot AS t ON c.codigo = t.codigo
  5. MATCH (t.texto)
  6. AGAINST ('texto1 texto2 texto3')
  7. AND c.codigo LIKE'D_______'
  8. AND c.codigo NOT LIKE'D50_____'
  9. LIMIT 40;
Código MySQL:
Ver original
  1. FROM tablascore
  2. ORDER BY score

Cuidado: Deben ejecutarse en forma seguida, y sin que se cierre la conexión.

Cuando la conexión se cierre o se interrumpa, esta tabla temporal se borrará sola. Además sólo el usuario que está en esta conexión puede verla (ventajas de las tablas temporary), y no importa si dos usuarios o más crean tablas con el mismo nombre.

Personalmente lo implementaría desde un SP, así hago una sola llamada.
__________________
¿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 14/05/2014, 12:11
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

una cosa más he de añadir, he comprobado el resultado y está ordenado por defecto por el campo score, por lo que no es necesario utilizar ORDER BY. Por lo tanto hemos pasado de 57 a 5s.

Pero hay que seguir mejorando, y no se por donde.

un saludo,
josé carlos.
  #9 (permalink)  
Antiguo 14/05/2014, 12:15
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: consulta fulltext bloquea el servidor

Prueba lo que te digo, e incluso te sugiero que lo hagas por SP.
Por otro lado, has reducido a un décimo el tiempo. Para un indice FULLTEX... es una buena diferencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 14/05/2014, 12:28
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

pues aunque no muestra el resultado, utilizo phpmyadmin, creo que no hay mejora del rendimiento, pues la ventana se refresca más o menos a los 4 ó 5 segundos.

muchas gracias, pero necesito mayor rápidez de respuesta.


un saludo,
josé carlos.
  #11 (permalink)  
Antiguo 15/05/2014, 12:13
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

hola,

He probado la consulta, haciéndola en phpMyAdmin no devuelve ningún resultado, y ejecutándola desde asp clásico devuelve un error de sintaxis (cerca del punto y coma: ;).

Código MySQL:
Ver original
  1. CREATE TEMPORARY TABLE tablascore
  2. select c.clave, c.codigo, c.unidad, c.resumen, c.precio, c.fecha, c.tipo, t.texto,
  3. MATCH(t.texto) AGAINST('texto1 texto2 texto3') AS score
  4. from precioc AS c
  5. INNER JOIN preciot AS t ON c.codigo = t.codigo
  6. MATCH(t.texto) AGAINST('texto1 texto2 texto3')
  7. and c.codigo LIKE 'D_______'
  8. and c.codigo NOT LIKE 'D50_____'
  9. LIMIT 40;
  10.  
  11. select * from tablascore order by score

no se por donde seguir,

gracias. un saludo.
  #12 (permalink)  
Antiguo 16/05/2014, 06:38
 
Fecha de Ingreso: julio-2002
Mensajes: 813
Antigüedad: 21 años, 8 meses
Puntos: 2
Respuesta: consulta fulltext bloquea el servidor

Ya lo tengo : Mostrando registros 0 - 39 (40 total, La consulta tardó 0.0035 seg)

He creado un índice para cada campo que se utiliza para unir las tablas en las consultas, en este caso los campos codigo de las 2 tablas precioc y preciot.

un saludo,
josé carlos.

Etiquetas: fulltext, join, select, servidor, sql, tabla
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:14.