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

Buscador web, ¿mejor implementación?

Estas en el tema de Buscador web, ¿mejor implementación? en el foro de Mysql en Foros del Web. Hola chicos, Tengo una práctica que consiste en crear un buscador con su sistema de administración, usuarios y toda la parafernalia. Todo está hecho menos ...
  #1 (permalink)  
Antiguo 13/04/2011, 13:54
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Buscador web, ¿mejor implementación?

Hola chicos,

Tengo una práctica que consiste en crear un buscador con su sistema de administración, usuarios y toda la parafernalia. Todo está hecho menos lo principal y más "fácil": obtener los resultados de búsqueda y mostrarlos. Hacer esto creo que sé hacerlo, pero me gustaría hacer una buena implementación y como el profesor sólo está para la labor de enseñarnos código que funcione sin ahondar en enseñarnos el MEJOR código que funcione, por ello recurro a vosotros.

El caso es que tengo el típico input html del cual obtengo un array($pclave) con tres palabras clave o tags. A partir de aquí debo mostrar los resultados de búsqueda de 10 en 10. Había pensado en crear dos funciones:

- Una función que me permita conocer en primera instancia el número de resultados de la búsqueda:
Código:
    "SELECT count(*) FROM url_tag WHERE pclave=$pclave[0] OR
                                        pclave=$pclave[1] OR
                                        pclave=$pclave[2]"
NOTA: La tabla url_tag es aquella que relaciona palabras clave con url's.

- Una función que me de el resultado de las búsquedas parciales(esta consulta no está completa, pues antes habría que hacer un INNER JOIN, pero esto es ahora irrelevante):
Código:
  "SELECT * FROM url ORDER BY idurl ASC LIMIT $inicio, $fin"
Esta consulta se ejecutará cada vez que se haga clic en un página de resultados(piensen en el buscador de Google, que abajo les muestra el número de página en la cual están).
  #2 (permalink)  
Antiguo 14/04/2011, 06:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Buscador web, ¿mejor implementación?

Y....

Se me ocurre que podrias investigar la opción de obtenerlo todo con una sola consulta a la bbdd.

Si obtienes todos los resultados posibles y los guardas en un objeto externo (array php, jsp o lo que estes usando) de este puedes obtener todo lo que necesites... el numero total (length) y luego acceder a los registros de cada pagina (bucle for...) sin volver a "molestar" a al servidor de bbdd... tendràs que guardar ese objeto en la session del usuario para no perderlo durante la consulta de las paginas...

Para hacer el count(*) que propones ya estas atacando toda la tabla con lo que quizas no es mucho más costoso obtener los resultados y tratarlos fuera....

Es otra via....

(obviamente en la segunda consulta has omitido la selección que tambien tendrás que usar al obtener
"todos los resultados posibles" en mi propuesta)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 14/04/2011 a las 06:53
  #3 (permalink)  
Antiguo 14/04/2011, 06:49
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Buscador web, ¿mejor implementación?

Hola quimfv

Gracias por contestar.

¿Pero no sería un poco burro almacenar, en el caso hipotético, 9000 objetos en un array, para luego tal vez sólo consultar 20 elementos?

Aunque tal vez tengas razón y sea preferible sacrificar memoria por procesador.

Saludos :)
  #4 (permalink)  
Antiguo 14/04/2011, 10:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Buscador web, ¿mejor implementación?

9000 registros en un objeto... debes analizar que es mas costoso muchas consultas al servidor o una sola .... y hacer trabajar la memoria
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 14/04/2011, 11:41
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Buscador web, ¿mejor implementación?

De acuerdo quimfv, gracias por opinar :D
  #6 (permalink)  
Antiguo 28/04/2011, 14:42
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Buscador web, ¿mejor implementación?

Hola de nuevo,

Quería informar que la solución aquí propuesta no es la correcta. Finalmente es muchísimo más eficientemente usar la instrucción COUNT que hacer una consulta completa y obtener de ahí el tamaño, como la función mysql_num_rows(), por ejemplo.

Pueden leer más sobre esto en los foros oficiales de mysql o leer el siguiente artículo:
http://paginaweb2.com/post-select-co...sqlnumrows-151

Saludos.
  #7 (permalink)  
Antiguo 28/04/2011, 16:53
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, 5 meses
Puntos: 2658
Respuesta: Buscador web, ¿mejor implementación?

Disculpa que meta la cuchara, pero usando tu mismo lenguaje, el ejemplo de esa web es una burrada absoluta. Ese código no está midiendo en realidad el tiempo de ejecución de una consulta, está comparando consultas incompatibles desde el punto de vista de uso de recursos.

La primera consulta, pide a MySQL que cuente la cantidad de registros totales de una tabla, lo que es relativamente rápido, pero por sobre todo la transferencia de datos en la red es extremadamente pequeña, ya que a duras penas requiere un datagrama en TCP. O sea, a nivel de red, es menos que un suspiro.

La segunda consulta pide que MySQL devuelva la totalidad de registros de la tabla, lo que puede implicar un enorme uso de memoria (dependiendo de la tabla), y grandes cantidades de datagramas para ser transferido. Eso puede significar tanto 100 Kb o 100 Mb de datos.
De hecho, es muy posible que el 99,99% del tiempo de esos 59.36 segundos sean en realidad tiempo de red, es decir, transferencia de datos, y no ocnsulta. No te olvides que un paquete transferido por internet o red ethernet no tiene más de 1500 bytes, por lo que mientras mayor sea el volcado de la tabla, mayor será cantidad de paquetes (y tiempo) se necesitarán para la transferencia.

Puedo decirte más, mientras que la segunda consulta lee forzosamente toda la tabla, la primera puede que ni siquiera esté accediendo a la suya, ya que para obtener esa infomación no se necesita eso, porque no es una lectura condicionada. En esos casos MySQL no lee la tabla. Lee la información de information_schema.tables.

A esto tienes que sumarle otra cosa: La primera consulta se ejecuta en MySQL y devuelve un sólo valor. La segunda se ejecuta en MySQL, pero el valor buscado lo devuelve PHP, no MySQL exactamente.

¿Se entienden las diferencias?

Por otro lado, el planteo de "mejor implementación" está incompleto, porque no estás considerando indices tipo IDEX, FULTEXT, ni su uso, así como tampoco estás planteando qué diseño tiene tu estructura de datos (lo que aportas es pobre), ni tampoco la selectividad que estás planteando para tus "palabras clave".
Falta demasiado para guiarte de forma efectiva.

Intenta de nuevo, si es posible con mejores términos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 28/04/2011 a las 17:22
  #8 (permalink)  
Antiguo 29/04/2011, 03:17
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Buscador web, ¿mejor implementación?

Gracias por tu aportación gnzsoloyo

Igualmente, para contar los registros de una consulta es más conveniente utilizar count. ¿Es cierto esto o no? En todos los foros de páginas inglesas están de acuerdo con esta afirmación.

Saludos.
  #9 (permalink)  
Antiguo 29/04/2011, 03:18
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Buscador web, ¿mejor implementación?

Además PHP no se diseñó para tratar grandes volúmenes de información. Sigo manteniendo que si tuviera que hacer una consulta de 10000 registros sería un poco burro cargar en una variable toda la información para SÓLO contar el número de registros que devolvería esa consulta.

Por cierto, nadie ha dicho que en esa web no hicieran la comprobación desde el propio ordenador, así que ahí poco tiene que ver la capacidad de la red.

Una vez más te agradezco tu aporte, pero finalmente has terminado dándome la razón. Para contar mejor COUNT que mysql_num_rows()

PS: Perdón por el doble post.

Última edición por kiko's; 29/04/2011 a las 03:25
  #10 (permalink)  
Antiguo 29/04/2011, 05:57
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, 5 meses
Puntos: 2658
Respuesta: Buscador web, ¿mejor implementación?

Cita:
Iniciado por kiko's Ver Mensaje
Además PHP no se diseñó para tratar grandes volúmenes de información. Sigo manteniendo que si tuviera que hacer una consulta de 10000 registros sería un poco burro cargar en una variable toda la información para SÓLO contar el número de registros que devolvería esa consulta.

Por cierto, nadie ha dicho que en esa web no hicieran la comprobación desde el propio ordenador, así que ahí poco tiene que ver la capacidad de la red.

Una vez más te agradezco tu aporte, pero finalmente has terminado dándome la razón. Para contar mejor COUNT que mysql_num_rows()

PS: Perdón por el doble post.
Tengo la impresión que no estás entendiendo mucho lo que te estoy diciendo, así que lo aclararé:
1) Usa un mejor lenguaje. La gentileza en los foros es muy apreciada, especialmente porque no podemos vernos el rostro, y el lenguaje escrito a veces no nos permite comprender humoradas entre costumbres de países distintos. Esto lo digo porque tus posts se sienten "ásperos"; nadie aquí califica de "burradas"; cuando usas ese término parece que asumieses una postura de superioridad que resulta molesta a los demás. A mí, al menos, me causa mala impresión.

2) Mis notas sobre lo afirmado en esa web se referían exclusivamente a que no podías usar eso como referencia de lo bueno o malo de los métodos, porque los planteos de los case eran incompatibles. Al no tratarse de procesos que usan los mismos tipos de recursos, no puede hacerse una prueba de benchmarking. Es lo mismo que estar comparando la performance de un avión con la de un barco... Son cosas y entornos distintos, lo que no implica que una de ellas esté bien o mal hecha.
Si la comparación se hubiese hecho entre un SP que invocara la función FOUND_ROWS() para devolver el valor, contra una consulta con COUNT(), tendría algún sentido porque ambas se resuelven en MySQL, y con el mismo server. Pero comparar el resultado de una consulta en MySQL contra una función afectada por el tráfico de red, en un lenguaje de programación no se puede hacer. Hay "ruido" en la información.
En esencia, esa prueba no te está diciendo nada. Es absolutamente imprecisa y no nos está informando si las consultas en sí tienen una diferencia real en tiempo de ejecución.

3) Respecto a si la prueba se hizo o no en la misma PC, eso tiene cierta irrelevancia, porque en cualquiera de los dos casos habría una diferencia dada por la performance del hardware y de la conexión.
En primer lugar, porque los datos son enviados por el servicio de MySQL a través de un buffer de datos, que tiene un límite.
En segundo lugar, si la consulta genera más de 64 Kb de datos, requiere más de un bloque de datos en memoria para almacenarse, y luego de cierta cantidad de uso de memoria el sistema operativo empeiza a hacer swapping al disco, lo que le agrega overhead.
En tercer lugar, los datos, aún en localhost, son enviados a través del protocolo TCP/IP, ya que la conexión entre la aplicación y el servicio se realiza solamente a través de este; el uso de localhost sólo imprime rapidez al proceso, pero no evita la fragmentación en datagramas, sino la de IP.
En cuarto lugar, luego de esto, PHP tiene que localizar en memoria todo, por lo que en cierta forma estás usando el doble de recursos de RAM necesarios: Los que usa la aplicación para los datos, y los que usó MySQL para generarlos (y que representan memoria no usable por PHP)...

Como puedes apreciar, los considerandos son algo más complejos.

Resumiendo:
- Si quieres hacer benchmarking entre consultas, asegúrate de que el escenario de las consultas es similar. No alcanza con parecerlo.
- Hacer la prueba planteada con la función mysql_num_rows() puede incluso ser una buena idea, dependiendo de lo que estés tratando de averiguar. Obviamente no es óptima para saber la performance de una consulta desde la óptica de MySQL.
- Si quieres calcular la cantidad de registros afectados por una consulta INSERT/UPDATE/DELETE, se usa ROW_COUNT().
- Si sólo quieres contar los registros, con o sin condiciones, se usa COUNT(). Esto no lee la tabla, y por eso es más rápida.
- Si le pones condiciones obligarás a MySQL a leer la tabla (eso sería una prueba interesante).
- Una consulta SELECT puede usar SQL_CALC_FOUND_ROWS para obtener la cantidad de registros que produce la consulta.
- Si la consulta efectivamente tendrá demasiados registros, y usa DISTINGT o GROUP BY, puede de todos modos optimizarse usando SQL_BIG_RESULT, para decirle a MySQL que procese con tablas temporales en disco y no en memoria. Eso afectará la performance de todos modos.
- La misma consulta (y esto es muy importante), en la misma PC, con los mismos datos, pero en momentos diferentes (consecutivos o no) pueden tener una performance distinta porque los DBMS no trabajan con métodos constantes, sino estadísticos. Esto hace que el parser pueda usar alternativas diferentes para ejecutar las mismas consultas dependiendo de los resultados anteriores, de los índices, de las condiciones y también del hardware usado.

Hay mucha tela para cortar en estos temas...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 29/04/2011 a las 06:22
  #11 (permalink)  
Antiguo 29/04/2011, 06:09
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Buscador web, ¿mejor implementación?

gnzsoloyo Creo que estás dándole demasiadas vueltas a la tortilla para intentar dejarme mal. La técnica de escribir una gran parrafada, llena de tecnicismos, para una consulta tan simple(como es la mía) sólo tiene como objetivo desviar la atención. Yo también me la conozco.

Y pido disculpas si mis palabras sonaron ásperas, pero para nada quería menospreciar la ayuda de quimfv. Es más, se las agradezco mil veces más pues fue el único que se molestó a ayudarme. Tú lo único que haces es intentar achicarme con bonitas palabras, cuando hubiese sido más simple decir que es mejor utilizar un COUNT para lo que yo quiero hacer.

Que tengan un buen día.

PS: Doy este tema por zanjado. No responderé a las próximas réplicas.

Etiquetas: buscadores
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 06:55.