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

[SOLUCIONADO] Caso complejo de resolver

Estas en el tema de Caso complejo de resolver en el foro de Mysql en Foros del Web. Hola muy buenos días. Os pongo en situación. Tengo una bd, con varias tablas, para este caso solo importa 1 de ellas, mas específicamente se ...
  #1 (permalink)  
Antiguo 27/04/2015, 03:09
 
Fecha de Ingreso: marzo-2012
Mensajes: 17
Antigüedad: 12 años, 8 meses
Puntos: 0
Caso complejo de resolver

Hola muy buenos días.

Os pongo en situación.

Tengo una bd, con varias tablas, para este caso solo importa 1 de ellas, mas específicamente se llama Usuarios.

Tiene los siguientes campos
-Id
-usuario
-password
-telefono (este es el campo que vamos a tratar)
-email
etc..

Vale, para usar esa bd tengo una aplicación móvil, y un api-rest. Ahora viene lo que no consigo hacer.

La aplicación móvil, en una de sus funciones, manda todos los nº de teléfono de la agenda del usuario. Pueden ser 50, que 100, que 300 , eso ya depende. Lo que hace es compararlos con los que tengo en BD de usuario. Y devuelve los que coinciden.
Todo funciona perfectamente cuando en BD hay 5 usuarios, pero ahora con mas de 300.000, ya no funciona correctamente tarda mucho en responder, etc...

Me gustaría saber como resolveríais este caso vosotros, ya que yo no lo consigo saber


Gracias
  #2 (permalink)  
Antiguo 27/04/2015, 04: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: 17 años
Puntos: 2658
Respuesta: Caso complejo de resolver

No parece un problema de base de datos sino de red, o bien de servicio web.
Cada consulta le debe llevar al mismo servidor de la base el mismo tiempo, pero si tienes miles por segundo tu servicio web es que no lo soporta. Son demasiados enlaces.

Por el lado de la base puede haber dos problemas.
Por un lado ineficientes consultas, falta de optimizacion o sobrecarga de consultas. Y por otro, restricciones a cantidad de accesos y consultas simultáneas.

D todos modos con lo que describes no hay información suficiente para saberlo. Necesitaríamos conocer bastantes detalles má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)
  #3 (permalink)  
Antiguo 27/04/2015, 04:16
 
Fecha de Ingreso: marzo-2012
Mensajes: 17
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Caso complejo de resolver

Vale te explico lo que hago actualmente....

Cojo la lista de teléfonos, y lo paso array cortándolo por la "," luego obtengo de bd todos los usuarios menos el que hace la consulta, y por ultimo por cada teléfono obtenido de bd lo busco en la lista que mande. Esa fue la manera mas rápida en la que respondía el server. Pero como te digo cuando tenia 50000 usuarios ahora ya tengo 3 veces mas
Cita:
Editado: Código de programación no permitido en foros de Bases de DAtos. Leer las reglas del foro, por favor.ç
Código SQL:
Ver original
  1. SELECT * FROM usuarios WHERE id <> ? ORDER BY USER
No se si necesita mucha explicación el código

Un saludo

Última edición por gnzsoloyo; 27/04/2015 a las 05:45
  #4 (permalink)  
Antiguo 27/04/2015, 05:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Caso complejo de resolver

Cita:
No se si necesita mucha explicación el código
No necesita explicación, pero te recomiendo leer las Reglas del foro de Bases de DAtos: No se postean códigos, ni se4 tratan temas de programación en este foro. Sólo SQL.

DE todos modos, ya se vislumra una aprte del problema: Estás haciendo basicamente un full tablescan para sólo bucar una cantidada acotada de telefonos, lo que es absurdamente ineficiente.
Primero, un full tablescan es un espanto de consulta. Es el error que hace colapsar cualquier servidor de BBDD, sin importar mucho lo poderoso que sea.
No se hacen.

Además, si ya tienes una lista acotada de numeros, lo que debes hacer es buscar en la base esa lista de números, y no traer todos los números posibles menos el del consultante.

En esencia, lo que te conviene es:
1) tener debidamente indexada la tabla por numero de telefono.
2) pasar como parámetros los numeros de la lista obtenida. De hecho si puedes en ese mismo momento excluir el del usuario consultante, mejor, asi te evitas pasar basura.
Quedaría mas o menos así:
Código SQL:
Ver original
  1. SELECT *
  2. FROM usuarios
  3. WHERE telefono IN('11111111', '2222222222', 3333333333', ...) #Aca la lista de telefonos a buscar
  4. ORDER BY USER
Te en cuenta que es un error de diseño de sistema hacer consultas iterativas (una a la vez), para obtener N registros, cuando la base peude devolverte el conjunto entero en una sola.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 27/04/2015, 06:53
 
Fecha de Ingreso: marzo-2012
Mensajes: 17
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Caso complejo de resolver

Pues llevabas razón, la consulta a pasado de ejecutarse en 15 seg aprox a tan solo unos milisegundos, el indice en teléfonos ya lo tenia establecido, no se como se me a podido pasar esa consulta, creía que al incluir dentro del in() unos 300 teléfonos, la consulta tardaría muchísimo, pero para nada, a sido rapidísimo

Muchas gracias
  #6 (permalink)  
Antiguo 27/04/2015, 07:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Caso complejo de resolver


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

Etiquetas: bd, campo, complejo, resolver, 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 10:33.