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

Pregunta sobre redundancia y factibilidad para servidor

Estas en el tema de Pregunta sobre redundancia y factibilidad para servidor en el foro de Mysql en Foros del Web. Hola a todos, ¿Qué es mejor? una tabla con 5.000 registros o 2 tablas con 2.500 registros Lo digo en cuanto a lo que tarde ...
  #1 (permalink)  
Antiguo 11/03/2011, 15:13
Avatar de VbOkonly  
Fecha de Ingreso: julio-2009
Ubicación: San Justo, Buenos Aires, Argentina
Mensajes: 490
Antigüedad: 14 años, 9 meses
Puntos: 5
Pregunta sobre redundancia y factibilidad para servidor

Hola a todos, ¿Qué es mejor?
una tabla con 5.000 registros
o 2 tablas con 2.500 registros
Lo digo en cuanto a lo que tarde la busqueda, si es mas pesado una cosa u otra, digamos que por un lado sacrificaría servidor, por el otro sacrificaria la database digamos ...
lo digo porque tengo una tabla "comentarios" y tengo 4 diferentes cosas
comentarios para hombres
comentarios para mujeres
comentarios para animales
comentarios para loros
(por ejemplo)
podria poner una identificacion en la tabla comentarios para identificar a los 4, o podria poner una tabla comentario para cada cosa ...
que seria lo adecuado ?
  #2 (permalink)  
Antiguo 11/03/2011, 15:37
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: Pregunta sobre redundancia y factibilidad para servidor

Lo adecuado es lo que el modelo E-R te indica: Una tabla donde se almacenan los comentarios con una FK a otra tabla donde se listan los tipos o temas de comentarios.
Cualquier otra cosa es alejarse del modelo y pagar caras luego las consecuencias.
Si tu problema es la performance, te recuerdo que la cantidad de registros afecta la performance, pero más lo afecta el diseño, la optimización de las consultas, los índices definidos, el hardware, etc.
Por darte un ejemplo práctico, hoy estuve optimizando una consulta que en términos generales procesaba cerca de un millón de registros para obtener casi 40.000. La consulta tardaba cerca de siete minutos en devolverme la data. Viendo esto, mandé a hacer un EXPLAIN de la misma para ver cómo la hacía y me di cuenta que no usaba ningún índice.
Le definí un índice sobre tres campos críticos, tras lo cual la consulta me devuelve la misma data... en 6,78 segundos.

¿Se entiende un poco la idea?

Más de cien veces más rápido, sólo por un índice...

A más de esto, te estoy hablando de procesar más de un millón de registros en menos de diez segundos. ¿No te parece que hacerte problemas por 5.000 es exagerado?
__________________
¿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 11/03/2011, 15:50
Avatar de VbOkonly  
Fecha de Ingreso: julio-2009
Ubicación: San Justo, Buenos Aires, Argentina
Mensajes: 490
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: Pregunta sobre redundancia y factibilidad para servidor

Muchas gracias por la información, soy novato en mysql y trato de hacer las cosas bien aunque tenga 10 registros ... Trato de hacer las cosas para que queden bien, lo que trato de hacer se reflejaria mas en esta metafora, si tengo un auto con un limite de 5000 kilometros, y solo le tengo que agregar un extra de metal para que funcione a 1000k kilometros porque no hacerlo ?.
Leeré un poco mas sobre el modelo E-R el cual me indicas, mis conocimientos se limitan al punto de evitar redundancias en la db nada mas y hasta ahi nomas ... Volviendo a tema, ¿Que seria lo adecuado para hacer? crear otra tabla por ejemplo
1 = loros
2 = hombres
3 = mujeres
4 = animales
y hacer el join en la consulta?, disculpa mi ignorancia

Gracias por responder.
  #4 (permalink)  
Antiguo 11/03/2011, 15:59
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: Pregunta sobre redundancia y factibilidad para servidor

Exacto. Ese tipo de tablas son funcionales porque evitan tener que recargar de datos las restantes, previenen la pérdida de consistencia, y el nunca bien ponderado factor humano (la interfase silla-teclado que decía un amigo mío).

Esas tablas son las que se denominan tablas fijas, porque en realidad no cambian a menos que el administrador de la base las actualice. Para todos los efectos son inmóviles.

La gran ventaja es que un JOIN contra ellas, como son PK numéricas, es mucho más eficiente que cualquier otra cosa.
__________________
¿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 11/03/2011, 16:06
Avatar de VbOkonly  
Fecha de Ingreso: julio-2009
Ubicación: San Justo, Buenos Aires, Argentina
Mensajes: 490
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: Pregunta sobre redundancia y factibilidad para servidor

Yo trabajo con php, digamos que lo que se me ocurre ahora (supongamos que estamos en la pagina donde se muestran las consultas sobre animales) le agrego a los datos a enviar un indice 1(1=animales) que será insertada en la tabla comentrarios en el campo "tipo".
despues para mostrarlas hago un join.
La ultima pregunta, yo tengo como pk en la tabla comentarios el campo id, y ahora crearé la nueva tabla "tipos" con los campos id, tipo y le asignare la pk a id y despues en la consulta para mostrar se hara el respectivo join, esto es factible?, disculpa por hacerte esta sopa de letras!
  #6 (permalink)  
Antiguo 11/03/2011, 16:32
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: Pregunta sobre redundancia y factibilidad para servidor

Como consejo práctico: No uses "id" como nombre de la PK para todas las tablas. Tiende a producir problemas cuando debes cruzar varias tablas y usas "," en lugar de "JOIN". Es preferible que uses algo así como "comentarios_id", "tipo_id", etc. Y ponlos de la misma forma en aquellas tablas donde esa PK actúe de FK.
Ese es un modo que se considera buena práctica en el diseño de bases de datos (fíjate que los programas de diseño por default ponen la PK numéricas con el nombre de la tabla como sufijo o prefijo).

En cuanto a manejarlo en la inserción, el tipo_id es el que tienes desde el comienzo. Cuando insertas el comentario, al mismo tiempo pones ese valor en la columna que corresponde a la FK y listo.
A su vez, para leer los datos completos, es simplemente un
Código MySQL:
Ver original
  1. SELECT columnas
  2. FROM comentarios C INNER JOIN tipos T ON C.tipo_id = T.tipo_id
  3. [WHERE T.tipo_id = valorbuscado];
Los corchetes indican la parte opcional. Si la pones es porque buscas los comentarios de un sólo sólo tipo de tema, sino te devolverá todos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/03/2011, 16:48
Avatar de VbOkonly  
Fecha de Ingreso: julio-2009
Ubicación: San Justo, Buenos Aires, Argentina
Mensajes: 490
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: Pregunta sobre redundancia y factibilidad para servidor

Bien, voy entendiendo un poco más(muchas gracias) ahora le cambiaré los campos a los pk porque todos los tengo como "id", gracias por el dato. Acabo de leer la diferencia entre inner join, left join y right join y me perdi un poco más, sobre el codigo que me expusiste entendi hasta "tipos T ON ... " ahi se me volvio chino jaja.
Mira te muestro la consulta que uso para mostrar los comentarios
Código MySQL:
Ver original
  1. SELECT * FROM comentarios WHERE id_noticia='$varrr' ORDER BY id ASC
(solo puedo mostrar las noticias de "mascotas" porque cuando filtro la noticia necesito si o si saber el tipo para que se filtre aun mas y llegar a "perdidos" etc ...
la pregunta es, como hago el join para que solo me muestre los datos de [(1=mascota)sigo con este ejemplo] con la sintaxis que puse anteriormente?

a la tabla comentarios le agregue un campo llamado "tipocorresponde" de tipo tinyint(4).
y agregue otra tabla llamada "tiposcomen" con los campos id(ahora lo cambiaré por tipo_id :P) y otro campo llamado "tipo" del tipo varchar. el mismo tiene 4 registros donde:
id tipo
1 mascota
2 perdido
3 adoptar
4 amor

como puedo hacer la consulta ?, se me complicó :P

Muchas gracias!
  #8 (permalink)  
Antiguo 11/03/2011, 17:30
Avatar de VbOkonly  
Fecha de Ingreso: julio-2009
Ubicación: San Justo, Buenos Aires, Argentina
Mensajes: 490
Antigüedad: 14 años, 9 meses
Puntos: 5
Respuesta: Pregunta sobre redundancia y factibilidad para servidor

Lo acabo de intentar asi mira

Código MySQL:
Ver original
  1. SELECT * FROM comentarios INNER JOIN tipos ON comentarios.tipocorresponde = tiposcomen.tipo [WHERE id_noticia='$varrr' AND tiposcomen.tipo = 'recuerdo' ORDER BY comentarios.id ASC]

y no funciona, pero es un intento xD, como es lo correcto?

muchas gracias por ayudar
  #9 (permalink)  
Antiguo 11/03/2011, 18: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, 4 meses
Puntos: 2658
Respuesta: Pregunta sobre redundancia y factibilidad para servidor

Código MySQL:
Ver original
  1. FROM comentarios INNER JOIN tipos ON comentarios.tipocorresponde = tiposcomen.tipo
  2. WHERE id_noticia='$varrr' AND tiposcomen.tipo = 'recuerdo'
  3. ORDER BY comentarios.id
Por allí no conoces las formas de escribir los ejemplos en los manuales...
Cuando se ponen cosas opcionales en los ejemplos es habitual ponerlas entre corchetes, para que la persona que lo lee entienda sin más que se trata de una parte que puede ir o no ir, según lo que el usuario necesite, pero no significa que los corchetes deban escribirse.
En algunos DBMS los corchetes tienen significado, pero no en MySQL.

Detalle: en el ORDER BY no hace falta indicar que algo es ASC, el orden ascendente es el orden predefinido. Sí tienes que indicar el descendente (DESC) porque ese no es default.
__________________
¿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: redundancia, servidor
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:24.