mysql - ¿cuántas columnas son demasiadas?

111

Estoy configurando una tabla que podría tener más de 70 columnas. Ahora estoy pensando en dividirlo, ya que algunos de los datos de las columnas no serán necesarios cada vez que se acceda a la tabla. Por otra parte, si hago esto, me quedo con tener que usar combinaciones.

¿En qué momento, si corresponde, se considera que hay demasiadas columnas?

Puntilla
fuente
6
No tenemos que usar SELECT * todo el tiempo. Siempre tenemos la opción de seleccionar solo las columnas que necesitamos para una situación determinada.
APC
3
70 columnas? ¿Cuántos de esos no pueden ser nulos?
OMG Ponies
1
La gran pregunta es ... ¿está normalizando sus tablas? 70 es una cantidad inusual a menos que esté desnormalizando deliberadamente para el rendimiento (muy pocas cosas tienen 70 atributos únicos). Si está desnormalizando por el bien del rendimiento, entonces estaría de acuerdo con ChssPly76 en que puede usar lo que sea que la base de datos le permita salirse con la suya.
Godeke
2
@KM. ¿se supone que eso es un chiste? Soy nuevo en MySQL y no puedo obtenerlo, ¿quiso decir que JOIN es algo bueno o algo que debe intentar y evitar?
Elia Iliashenko
2
Por mucho que las uniones sean una parte central de SQL, unirse por unirse probablemente degradará el rendimiento y la capacidad de mantenimiento de cualquier aplicación que tenga.
jeteon

Respuestas:

142

Se considera demasiados una vez que supera el límite máximo admitido por la base de datos .

El hecho de que no necesite que todas las columnas sean devueltas por cada consulta es perfectamente normal; es por eso que la instrucción SELECT le permite nombrar explícitamente las columnas que necesita.

Como regla general, la estructura de su tabla debe reflejar su modelo de dominio; si realmente tiene 70 (100, qué hay) atributos que pertenecen a la misma entidad, no hay razón para separarlos en varias tablas.

ChssPly76
fuente
29
@KM - por eso dije "atributos que pertenecen a la misma entidad en el modelo de dominio". Un gran número de columnas en la tabla NO la desnormaliza; es lo que representan dichas columnas lo que importa. Además, aunque la normalización es definitivamente algo bueno, NO es una solución a todos los problemas de la vida. Pregunta engañosa: ¿cree que el número de votos junto a la pregunta / respuesta SO se calcula como select count(*) from votescada vez o cree que tal vez esté desnormalizado? ¿Eso hace que la base de datos SO sea mala y que Jeff Atwood se vuelva loco?
ChssPly76
@ ChssPly76, es una base de datos relacional, no un modelo de objetos. hay tablas, filas y columnas, trabaje dentro de esa restricción si desea un rendimiento máximo, imite sus objetos por conveniencia en aras del rendimiento. Entonces, ¿debería almacenarse toda la información sobre una persona en la misma fila? no, divídalos y agrúpelos en diferentes tablas (usando mi ejemplo de mi comentario anterior): "Persona", "Actividades" "Registros de salud". Almacenar una SUM por motivos de rendimiento es un problema completamente diferente a mantener todos los datos en 70 columnas para evitar uniones.
KM.
20
¿Debería "numberOfTeethPulled" formar parte del registro de persona? No, probablemente no debería almacenarse en absoluto; obtendrá esa información de "ToothExtractionRecord" si su modelo de dominio requiere tal nivel de detalle. Pero ese es SU (y, me atrevería a decir, bastante artificial) ejemplo: no tiene nada que ver con mi punto: una gran cantidad de columnas en una tabla NO significa que la tabla esté desnormalizada. Piense en contratos de bienes raíces / órdenes de compra / otros documentos financieros solo por nombrar algunos ejemplos. ¿Se pueden dividir aún más en varias tablas? Si. ¿Alguna razón para hacerlo? Realmente no.
ChssPly76
1
+1, eso fue muy gracioso. Si está creando otra tabla y va a ser una relación 1: 1, probablemente debería incluirla en la tabla principal. No va a ahorrar espacio, no va a funcionar mucho mejor si no solicita los datos en lugar de no estar en la tabla en absoluto. La razón única de fiar que viene a la mente para mí en este momento, es si hay información sensible allí como SSN, información de tarjeta de crédito, etc ...
Vandel212
1
Si tengo una tabla con 15 columnas y otra con 300 columnas, la clave principal de las dos tablas es la misma. Seleccione una columna en las dos tablas, ¿el rendimiento será significativamente diferente?
una oferta no se puede rechazar
28

Hay algunos beneficios de dividir la tabla en varias con menos columnas, lo que también se denomina Partición vertical . A continuación, presentamos algunos:

  1. Si tiene tablas con muchas filas, modificar los índices puede llevar mucho tiempo, ya que MySQL necesita reconstruir todos los índices de la tabla. Tener los índices divididos en varias tablas podría hacerlo más rápido.

  2. Dependiendo de sus consultas y tipos de columna, MySQL podría estar escribiendo tablas temporales (utilizadas en consultas de selección más complejas) en el disco. Esto es malo, ya que la E / S de disco puede ser un gran cuello de botella. Esto ocurre si tiene datos binarios (texto o blob) en la consulta.

  3. Una tabla más amplia puede provocar un rendimiento de consulta más lento.

No optimice prematuramente, pero en algunos casos, puede obtener mejoras de tablas más estrechas.

Jonstjohn
fuente
5
¿Por qué MySQL necesita reconstruir todos los índices de la tabla si solo se modifica uno?
Petr Peller
Me estaba preguntando lo mismo . ¿Por qué MySQL reconstruye todos los índices de la tabla? ¿Es correcta la declaración mencionada anteriormente?
maj
13

Son demasiados cuando viola las reglas de normalización. Es bastante difícil obtener tantas columnas si está normalizando su base de datos. Diseñe su base de datos para modelar el problema, no alrededor de reglas artificiales o ideas sobre la optimización para una plataforma de base de datos específica.

Aplique las siguientes reglas a la tabla amplia y probablemente tendrá muchas menos columnas en una sola tabla.

  1. Sin elementos repetidos o grupos de elementos
  2. Sin dependencias parciales en una clave concatenada
  3. Sin dependencias de atributos no clave

Aquí hay un enlace para ayudarlo.

JohnFx
fuente
17
It is pretty hard to get that many columns if you are normalizing your database.No es tan difícil como parece.
Petr Peller
5
Definitivamente no es tan difícil. La gente no parece entender realmente las formas normales en estas partes. Puede tener 10000 columnas y TODAVÍA normalizarse (incluso a la forma normal más alta).
Hejazzman
2
@foljs Y ahí es exactamente donde entra en juego la práctica aceptada de desnormalización. Si estás en una intersección y un auto está a punto de chocarte, sería estúpido esperar a que el semáforo se ponga verde. Tienes que salir del camino. Si bien pasar la luz roja podría no ser técnicamente legal, estás haciendo lo que obviamente debes hacer dada la situación = desnormalización
user3308043
3
Me perdiste cuando empezaste a hablar de coches. No tengo idea de cuál es la relevancia.
JohnFx
2
Sin embargo, ¿cómo se realizan consultas complejas en este escenario con una sola tabla de datos? No puede, ¡tiene que depender en gran medida del lenguaje de programación y una variedad de otras cosas para que esto funcione! Por lo tanto, también podría volver a tener una tabla con 170 columnas, porque tener consultas "JOIN" y programación extra compleja que requiere hacer que las tablas independientes funcionen me parece una pérdida de tiempo. Supongo que soy un gran admirador del principio KISS.
Vlad Vladimir Hercules
0

Eso no es un problema a menos que todos los atributos pertenezcan a la misma entidad y no dependan unos de otros. Para hacer la vida más fácil, puede tener una columna de texto con una matriz JSON almacenada en ella. Obviamente, si no tiene problemas para obtener todos los atributos cada vez. Aunque esto frustraría por completo el propósito de almacenarlo en un RDBMS y complicaría mucho cada transacción de la base de datos. Por lo tanto, no se recomienda seguir un enfoque en toda la base de datos.

Zeeshan Ch
fuente
0

Tener demasiadas columnas en la misma tabla también puede causar grandes problemas en la replicación. Debe saber que los cambios que ocurren en el maestro se replicarán en el esclavo ... por ejemplo, si actualiza un campo en la tabla, toda la fila será w

Hoy
fuente