2011-07-14 15 views
7

Tengo alrededor de 28 millones de registros para importar a una base de datos mySql. El registro contiene información personal sobre los miembros en los EE. UU. Y los estados podrán buscarlo.Dividir una gran tabla mySql en otras más pequeñas: ¿vale la pena?

Mi pregunta es, ¿es más eficiente dividir la mesa en tablas más pequeñas en lugar de mantener todo en una gran mesa? Lo que tenía en mente era dividirlos en 50 tablas separadas que representaban los 50 estados, algo así como: members_CA, members_AZ, members_TX, etc;

De esta manera yo podría hacer una consulta como esta:

'SELECT * FROM members_' . $_POST['state'] . ' WHERE members_name LIKE "John Doe" '; 

De esta manera sólo tengo que tratar con datos para un estado dado de una vez. Intuitivamente tiene mucho sentido, pero me gustaría escuchar otras opiniones.

Gracias de antemano.

+1

Entonces, si busca un nombre de usuario en todos los estados, ¿usará 50 uniones? – Jacob

+8

Nunca, nunca desea hacer lo que describió. Guárdelo en 1 tabla, nunca lo divida en 50 tablas. Hay algo llamado partición y MySQL le permite particionar su tabla de acuerdo con algunas reglas. Investígalo y tómalo desde allí, y NUNCA, nunca pienses en crear una tabla separada si algo difiere en 1 atributo. Es un horrible diseño db y una pesadilla para mantener, y mucho menos usar. –

Respuesta

16

Lo publiqué inicialmente como comentario, pero ahora lo voy a publicar como respuesta.

Nunca, nunca piense en crear tablas X en función de una diferencia en el atributo. Así no es como se hacen las cosas.

Si su tabla tendrá 28 millones de filas, piense en la partición para dividirla en conjuntos lógicos más pequeños.

Puede leer sobre particionamiento en MySQL documentation.

La otra cosa es elegir el diseño de db adecuado y elegir los índices correctamente.

La tercera cosa sería que evite la terrible idea de usar $ _POST directamente en su consulta, ya que probablemente no le gustaría que alguien le inyectara SQL y descartara su base de datos, tablas o lo que no.

Lo último es elegir el hardware adecuado para la tarea, no desea que una aplicación así se ejecute en VPS con 500 mb de ram o 1 gig de ram.

+0

Gracias, esto es exactamente lo que estaba buscando. – higgenkreuz

0

Mi primera respuesta es que debe mantener todos los datos similares juntos y mantenerlos como una sola tabla. Debería considerar poner índices en su tabla para aumentar el rendimiento, pero no dividirlo en tablas más pequeñas.

1

Si crea un índice en la columna de estado, seleccionar en todos los miembros de un estado será tan eficiente como el uso de tablas separadas. Splittimg la mesa tiene muchas desventajas. Si agrega columnas, debe agregarlas en 50 tablas. Si desea datos de diferentes estados, debe usar declaraciones de sindicatos que serán muy desagradables e ineficientes. Recomiendo encarecidamente quedarse en una mesa.

2

No hacer eso. Mantenga los datos similares en 1 tabla en sí. Tendrá serios problemas para implementar decisiones lógicas y realizar consultas cuando la decisión abarque muchos estados. Además, si necesita cambiar la definición de la base de datos como agregar columnas, tendrá que realizar la misma operación en todas las numerosas tablas (aparentemente infinitas).

Utilice la indexación para aumentar el rendimiento, pero quédese en una sola tabla.

También puede aumentar la caché de la memoria, para lograr el rendimiento. Follow this article to do so.