Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Busqueda mas rapida

Estas en el tema de Busqueda mas rapida en el foro de Frameworks JS en Foros del Web. Alguien sabe como hacer una busqueda mas rapida por medio del Ajax, es que en mi tablas tengo 10000 registros y se demora un poco ...
  #1 (permalink)  
Antiguo 01/02/2007, 08:36
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Busqueda mas rapida

Alguien sabe como hacer una busqueda mas rapida por medio del Ajax, es que en mi tablas tengo 10000 registros y se demora un poco en buscar algun registro.
  #2 (permalink)  
Antiguo 01/02/2007, 09:50
Avatar de Valkam  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Con AJAX no mejorarás la búsqueda, es simplemente otra forma de acceder a los datos desde el cliente. Deberás investigar otras técnicas para optimizar la búsqueda dentro de tu BD. Quizás podrías dividir un poco esa tabla.
  #3 (permalink)  
Antiguo 01/02/2007, 11:03
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Cita:
Iniciado por Valkam Ver Mensaje
Con AJAX no mejorarás la búsqueda, es simplemente otra forma de acceder a los datos desde el cliente. Deberás investigar otras técnicas para optimizar la búsqueda dentro de tu BD. Quizás podrías dividir un poco esa tabla.
Gracias por responder, pero no puedo dividir las tablas, tendre que buscar otra forma.
Salu2.
  #4 (permalink)  
Antiguo 05/02/2007, 13:39
Avatar de rubensk  
Fecha de Ingreso: febrero-2007
Mensajes: 3
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Busqueda mas rapida

que motor para base de datos usas?
  #5 (permalink)  
Antiguo 05/02/2007, 16:29
 
Fecha de Ingreso: julio-2004
Mensajes: 11
Antigüedad: 19 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Ummmm. está bien indexada la tabla esta que dices? Creo que 10000 registros no son tantos para que tarde tanto como dices. Siempre que estemos hablando de realizar la búsqueda, si de lo que estamos hablando es de pintar en pantalla los 10000 registros ya es otra cosa. Aquí lo que tarda realmente es pintar, no recuperar.
  #6 (permalink)  
Antiguo 07/02/2007, 21:31
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Uso el MySQL, y los registros que busco los pongo en un select, me entienden?

osea en un input voy escribiendo el nombre de un producto y a medida que escribo, va buscando los registros con esas palabras y los va poniendo en un select, para que luego una vez que escoja un producto, me inserte una fila en una tabla con el nombre de ese producto incluido su precio.

Demora un poquito pero quisiera que la busqueda sea aun mas rapida, es que estoy haciendo un proyecto un poco grande y cuando ingreso solo yo se demora un poquito en hacer la busqueda, imaginense cuando entren 900 o 1000 usuarios a la vez.

Esa es la razon por la cual quiero mejorar esa busqueda.

Gracias por la ayuda.
  #7 (permalink)  
Antiguo 08/02/2007, 02:53
Avatar de Valkam  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Sigamos desgranando un poco tu aplicación . ¿Que lenguaje estas usando en el servidor ?
  #8 (permalink)  
Antiguo 11/02/2007, 12:33
 
Fecha de Ingreso: julio-2004
Mensajes: 11
Antigüedad: 19 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Vale, entonces... entiendo que cada vez que pulsas una tecla se hace una llamada ajax para recuperar los datos que coincidan con lo que has escrito, no?

Pues... me temo que si lo haces así... el problema que tienes (aparte de lo que tarde la BD en recuperar los datos y el tiempo de crear los valores en el select) es, además, el tiempo de respuesta del servidor y eso si que no lo puedes optimizar mucho. Bueno, podrías hacer que la página que retorna los datos sea lo más atómica posible, pero el tiempo de retorno de datos (por parte del servidor) lo seguiráis teniendo.

Puede ser un poco bestia según el volumen de datos, pero.. has pensado en descargar a cliente los datos que te interesen (todos) y tratar ahí un vector ordenado con javascript para escribir el select. Esto eliminaría el tiempo ese que te decía antes y no es complicado de montar. Supongo que de lo que estamos hablando es de recuperar pares de id y nombre de usuario (por ejemplo, no?).

Dime algo, ok?
Saludos...
  #9 (permalink)  
Antiguo 11/02/2007, 15:11
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Pues lo que trato de recuperar son el Id y el nombre del producto y su precio, en un select con su propiedad size=6 , al momento de presionar una tecla me busca a todos los productos que empiezen con esa letra, pueden ser 10, 20, o 60,etc, pero se demora un poco en mostrarlos pero ese select se crea con una pagina php.

Aunque he estado pensado en crear ese select usando DOM pero no se como agregarles los productos en cada <option>.

Bueno una vez que me muestre la lista de los productos, al seleccionar uno, se agrega a una tabla creada con DOM se crea una fila con 5 celdas en cada celda va lo siguiente:nombre del producto,precio, un <text> para que escriban la cantidad que desean comprar, en la 4º celda el subtotal, y el la 5ª un boton para que elimine ese producto si es que no lo desea.

y cada vez que escribo la cantidad el precio por la cantidad se multiplican para que se muestre el subtotal.

Y tambien se va mostrando el Total a pagar, con su IGV
Osea ya logre todo eso, al principo tenia problemas, pero ya solucione todos los errores, tenia que hacer varias validaciones pero las pude hacer todas.

Solo me falta eso de que la busqueda se haga mas rapida, y otro detalle al momento de grabar.

He pensado en la paginacion ya que al momento de busca se usa el LIMIT para mostrar solo unos cuantos, pero como no es una pagina en donde voy a mostrar los resultados sino un select, pues..., pero espero lograrlo.

Salu2.
  #10 (permalink)  
Antiguo 12/02/2007, 04:52
Avatar de Valkam  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Se me ocurre una posible solución, aunque tratándose de PHP requiere un pequeño esfuerzo de programación: podrías usar una estructura árbol para almacenar el resultado de tu búsqueda.
Me explico: según lo que he entendido, cuando un usuario pulsa una tecla, realizas una búsqueda en la base de datos de todos los productos que empiezan por esa letra. Lo más lógico es que la siguiente acción del usuario no sea borrar la primera letra que ha escrito y por tanto la nueva búsqueda en la base de datos te dará productos que ya encontraste en la primera búsqueda. Deberías organizar los datos de la primera búsqueda en un árbol de búsqueda de forma que conforme el usuario va escribiendo el nombre del producto, puedas encontrar todos aquellos que empiezan por esas letras y que ya buscastes la primera vez. Para ello deberías usar variables de sesión para no perder los resultados de esa primera búsqueda. Solo debes buscar de nuevo en el caso de que el usuario cambie la primera letra.

Usando árboles obtendrás respuestas muy rápidas si los datos están bien organizados. Si no te merece la pena construirte los árboles en PHP, puedes simplemente hacer búsquedas simples en arrays aprovechando que el resultado de la consulta a la base de datos te dará los datos ordenados.

Un Saludo
  #11 (permalink)  
Antiguo 12/02/2007, 07:43
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Gracias por el consejo, voy a intentarlo.
  #12 (permalink)  
Antiguo 13/02/2007, 14:29
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Aun no me sale, puedes darme un pequeño ejemplo?
  #13 (permalink)  
Antiguo 14/02/2007, 02:37
Avatar de Valkam  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Tendrás que usar variables de sesión para almacenar los datos de la primera búsqueda. La forma sencilla es que almacenes el resultado de la primera búsqueda en la base de datos en un array de sesión. En ese array tendremos por tanto después de la consulta a la base de datos, todos los productos que empiezan por una determinada letra, por ejemplo la 'a'.
Cuando el usuario pulsa otra tecla, por ejemplo la 'b', ya no extraes los datos de la base de datos, sino que recorres el array anterior quedándote con aquellos productos que empiezan por 'ab'.

Muy resumido:

Código PHP:
session_start();

$cad $_POST['producto']; //Entrada del usuario

if (isset($HTTP_SESSION_VARS['productos'])) 
{
   
//Busqueda en el array
   
foreach($HTTP_SESSION_VARS['productos'] as $producto)
        if(
substr($producto0strlen($cad)) == $cad
              
printf($producto);
}
else  
{
   
//Aun no se ha buscado la primera vez en la base de datos
   //Buscar en la base de datos todos los productos que empiezen por $cad


  #14 (permalink)  
Antiguo 14/02/2007, 13:26
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Gracias por el ejemplo, voy a intentarlo
  #15 (permalink)  
Antiguo 14/02/2007, 14:45
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Gracias por la ayuda.

Ya lo logre,y lo busca con mas rapidez pero a partir de la segunda busqueda pero el problema es que necesito que a la primera busqueda lo haga con rapidez, a la primera se demora algo de 7 segundos.


Es que como dijeron no se demora en encontrarlos, si no en mostrarlos,

Código PHP:

<select name="list" size="9" onchange="insertarFila(this)">
<?php
while($fields mysql_fetch_array($rs))
{

//esto es para guardarlos en un array, ya que no se ocurre otra forma,
//$items[$fields["item_codi"]][$fields["item_nomb"]]=$fields["item_pvt1"];
//

?>
<option value="<?=$fields["item_nomb"].'@'.$fields["item_pvt1"].'@'.$fields["item_codi"]?>"><?=$fields["item_nomb"]?></option>
<?php
}
?>
</select>
por ejemplo cuando pulso la letra "e" me muestra 527 productos en 7 segundos.

aunque se me ha ocurrido enviar el array $items(la linea que esta comentada) a Javascript,y alli crear el <select> con los <option> y con los valores del array.

Si creo los los objetos <select> y <option> con Javascript supongo que sera mas rapido,

Se podra hacer?

Yo puedo enviar variables de Javascript a PHP por medio del Ajax, pero al reves no lo se, y tambien el archivo en el que esta el select se llama bus.php, mientras que en el archivo nota_pedido.php hay una etiquerta DIV y alli pongo en el select, me entienden?

Tambien se ha ocurrido otra solucion la cual seria en la consulta ponerle un LIMIT 0,30 por ejemplo, para que solo me muestre 30 registros, luego si sigo bajando con la barra del desplazamiento del <select> que me busque los demas producto a partir de la posicion 31

Se podra hacer?

Si saben como ayudarme me avisan, porque yo seguire intentandolo.

pd: la razon por la cual concateno el codigo, nombre y precio del producto con el Arroba es que al momento de seleccionar un producto, llamo a una funcion de Javascript esa funcion hace un split el cual los separa y en una nueva fila de una tabla me muestra el nombre con su precio.

Salu2

Última edición por StrikeFreedom; 14/02/2007 a las 15:20
  #16 (permalink)  
Antiguo 15/02/2007, 02:28
Avatar de Valkam  
Fecha de Ingreso: junio-2006
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Busqueda mas rapida

Buenas, si consultas cualquier guía de estilo de desarrollo de interfaces gráficas encontrarás que poner más de 9 opciones en un select se considera una mala decisión de diseño de la interfaz. Si el usuario pulsa una tecla y ve que cambia algo (en este caso el select) lo más común es que vaya a consultar en ese momento el select y al ver 527 productos te aseguro que no buscará el que quiere y suerte tendrás sino cierra la página.
Creo que como bien dices debes usar un límite. El problema es que si limitas a 30 productos tu búsqueda es muy probable que el buscado no se encuentre en los primeros 30. Imagina por ejemplo que el que busca sea por casualidad de los últimos que encontrarías en la base de datos. Obligarias al usuario a bajar la barra de desplazamiento del select muchísimas veces y además ese es un comportamiento no muy común, que el usuario es posible que no se espere o que necesite aprenderlo.

Lo que yo haría sería o bien no mostrar los productos en el select hasta que el usuario no haya escrito un número de letras tal que el número de productos que empiezan por ella sea razonable (y razonable para mi no son mas de 20), o bien organizas la base de datos de otra manera. Supongo que no todos los productos serán de la misma categoría. Podrás agruparlos por algún criterio, que despues podrías usar para filtrar la búsqueda. Si te fijas en la mayoría de los portales de venta se hace así.

Un Saludo
  #17 (permalink)  
Antiguo 15/02/2007, 07:58
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Busqueda mas rapida

Cita:
Creo que como bien dices debes usar un límite. El problema es que si limitas a 30 productos tu búsqueda es muy probable que el buscado no se encuentre en los primeros 30. Imagina por ejemplo que el que busca sea por casualidad de los últimos que encontrarías en la base de datos. Obligarias al usuario a bajar la barra de desplazamiento del select muchísimas veces y además ese es un comportamiento no muy común, que el usuario es posible que no se espere o que necesite aprenderlo.
Es que esa parte esta solo hecho para clientes de una empresa, no es para todos, solo se puede ingresar con password, para que los clientes hagan su pedido de los productos que normalmente le compran a la empresa, pero a medida que escribe el nombre del producto va disminuyendo los elementos del select (option), van quedando menos. Por ejemplo cuando escriben la letra "e" muestra 527, cuando escribe "es" van quedando 300, y asi van disminuyendo.

Lo unico que quiero es que a la primera que vez que busque no se demore tanto.

Cita:
Supongo que no todos los productos serán de la misma categoría. Podrás agruparlos por algún criterio, que despues podrías usar para filtrar la búsqueda. Si te fijas en la mayoría de los portales de venta se hace así
.

Exacto, eso es lo que tenia planeado hacer, pero el ingenierio me pidio que haga la busqueda de esa manera ya que es algo muy poco visto y para salir de lo comun; bueno eso fue lo que me dijo.

Pero voy a volver a decirle que cambie de opinion, espero que esta vez me haga caso.

Aunque si no quiere, tendre que seguir intentando.

Salu2.

Última edición por StrikeFreedom; 15/02/2007 a las 09:57
  #18 (permalink)  
Antiguo 04/06/2011, 14:03
 
Fecha de Ingreso: junio-2011
Mensajes: 2
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Busqueda mas rapida

Podrías utilizar un limit al final de tu consulta sql que realizas por medio de php y verificar que este creado el indice de tu campo principal
  #19 (permalink)  
Antiguo 05/06/2011, 12:44
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 13 años, 9 meses
Puntos: 55
Respuesta: Busqueda mas rapida

Pues para empezar deberías colocar que a la primera letra no busque coincidencias ya que por una letra las coincidencias son muy grandes como tu dices y no tendra entre los primeros lo que busca casi nunca, a partir de la segunda busque las coincidencias usando limit yo recomiendo 10 para que se vea mejor el diseño.
__________________
<?php echo "No te metas a lo hondo del Mar si no sabes nadar, primero aprende a nadar" ?>
...Error en linea: 1 o.O
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

SíEste tema le ha gustado a 1 personas




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