Código de error 1117 demasiadas columnas; MySQL columna de límite en la mesa

dba.stackexchange https://dba.stackexchange.com/questions/3972

  •  16-10-2019
  •  | 
  •  

Pregunta

Tengo una tabla con 1699 columnas y cuando estoy tratando de insertar más columnas consigo,

Código de error: 1117. Demasiados columnas

En esta tabla sólo tengo 1.000 filas. Para mí lo más importante es el número de columnas. ¿Hay alguna limitación en la mesa? Quiero crear 2.000 columnas. ¿Es eso posible?

¿Fue útil?

Solución

¿Por qué se necesita para crear una tabla con hasta 20 columnas, y mucho menos 2000 ???

Por supuesto, los datos no normalizados puede evitar tener que hacer JOIN para recuperar muchas columnas de datos. Sin embargo, si usted tiene más de 10 columnas, usted debe parar y pensar en lo que sucedería bajo el capó durante la recuperación de datos.

Si un 2000 sufre una tabla de columna SELECT * FROM ... WHERE, que le generará grandes tablas temporales durante el procesamiento, ir a buscar columnas que son innecesarias, y la creación de muchos escenarios en los paquetes de comunicación (max_allowed_packet ) sería empujado hasta el borde en cada consulta.

En mis primeros días como un desarrollador, que trabajaba en una empresa de vuelta en 1995, donde fue el DB2 RDBMS principal. La compañía tenía una única mesa que tenía 270 columnas, índices de decenas, y problemas de rendimiento tenido recuperación de datos. Se pusieron en contacto IBM y tenía consultores mirar por encima de la arquitectura de su sistema, incluyendo éste mesa monolítica. La compañía se le dijo "Si no se normalizan esta tabla en los próximos 2 años, DB2 no en las consultas que realizan procesamiento Etapa 2 (cualquier consulta que requiere la ordenación por columnas no reajustables)." Esto fue dicho a una compañía multi-billones de dólares, para normalizar una mesa 270 de columna. ¿Cuánto más una tabla de columna 2000.

En términos de MySQL, se tendría que compensar tal mal diseño de opciones comparables al tratamiento Etapa 2 DB2 de ajuste. En este caso, las opciones serían

Tweeking estos ajustes para compensar la presencia de decenas, cientos dejar solos, de columnas funciona bien si usted tiene TB de RAM.

Este problema se multiplica geométricamente si se utiliza InnoDB ya que tendrá que lidiar con MVCC (multiversión control de concurrencia) tratando de toneladas protección contra escritura de columnas con cada uno de SELECT, UPDATE y DELETE a través de aislamiento de transacción.

Conclusión

No hay sustituto o tirita que puede compensar por un mal diseño. Por favor, por tu bien de su cordura en el futuro, que normalizar mesa hoy !!!

Otros consejos

Estoy teniendo problemas para imaginar cualquier cosa, donde el modelo de datos podría contener legítimamente 2000 columnas en una tabla normalizada correctamente.

Mi conjetura es que es probable que hacer una especie de "relleno de los espacios en blanco" esquema desnormalizaremos, en realidad estás almacenar todos los diferentes tipos de datos en la tabla, y en lugar de romper la salida de datos en tablas separadas y hacer relaciones, usted tiene varios campos que registran qué "tipo" de datos se almacenan en una fila determinada, y el 90% de sus campos son nulos. Incluso entonces, sin embargo, a querer llegar a 2000 Columnas ... uff.

La solución a su problema es que replantearse su modelo de datos. Si usted está almacenando una gran pila de datos clave / valor que está asociada con un registro dado, por qué no un modelo de esa manera? Algo así como:

CREATE TABLE master (
    id INT PRIMARY KEY AUTO_INCREMENT,
    <fields that really do relate to the
    master records on a 1-to-1 basis>
);

CREATE TABLE sensor_readings (
    id INT PRIMARY KEY AUTO_INCREMENT,
    master_id INT NOT NULL,   -- The id of the record in the
                              -- master table this field belongs to
    sensor_id INT NOT NULL,
    value VARCHAR(255)
);

CREATE TABLE sensors (
    id INT PRIMARY KEY AUTO_INCREMENT,
    <fields relating to sensors>
);

A continuación, para obtener todas las entradas de los sensores asociados a un determinado registro "maestro", sólo puede SELECT sensor_id,value FROM sensor_readings WHERE master_id=<some master ID>. Si usted necesita para obtener los datos de un registro en la tabla master junto con todos los datos de los sensores para ese registro, se puede utilizar una combinación:

SELECT master.*,sensor_readings.sensor_id,sensor_readings.value
FROM master INNER JOIN sensor_readings on master.id=sensor_readings.master_id
WHERE master.id=<some ID>

Y luego se une aún más si necesita detalles de lo que cada sensor es.

Es un sistema de medición con 2000 sensores

Ignorar todos los comentarios gritando acerca de la normalización - lo que usted está pidiendo podría ser de diseño sensata base de datos (en un mundo ideal) y perfectamente normalizado, es sólo muy inusual, y como se ha señalado en otros lugares RDBMS son por lo general simplemente no diseñado para esto muchas columnas.

A pesar de que no está golpeando el MySQL dura límite , uno de los otros factores mencionados en el enlace es, probablemente, que le impide ir más alto

A medida que otros sugieren, que podría evitar esta limitación por tener una tabla secundaria con id, sensor_id, sensor_value, o más simplemente, se podría crear una segunda tabla para contener sólo las columnas que no caben en la primera (y utilizar el mismo PK)

MySQL 5.0 Límites Columna-Count (énfasis añadido):

Hay un límite duro de 4096 columnas por tabla , pero el máximo efectivo puede ser menor para una tabla dada. El límite exacto depende de varios factores que interactúan.

  • Cada mesa (independientemente del motor de almacenamiento) tiene un tamaño máximo de fila de 65.535 bytes. motores de almacenamiento pueden colocar restricciones adicionales sobre este límite, lo que reduce el tamaño de fila máximo efectivo.

    El tamaño máximo de fila limita el número (y posiblemente tamaño) de las columnas debido a que la longitud total de todas las columnas no puede exceder este tamaño.

...

motores de almacenamiento individuales pueden imponer restricciones adicionales que cuentan columna de la tabla de límites. Ejemplos:

  • InnoDB permite hasta 1000 columnas.

En primer lugar un poco más en llamas, a continuación, una solución real ...

estoy básicamente de acuerdo con las llamas ya lanzado en usted.

No estoy de acuerdo con la clave-valor de normalización. Consultas terminar siendo horrible, rendimiento aún peor.

Una forma 'simple' para evitar el problema inmediato (limitación del número de columnas) es 'verticalmente partición' los datos. Tener, digamos, 5 mesas con 400 columnas cada una. Todos ellos tienen la misma clave primaria, excepto uno podría tener que ser AUTO_INCREMENT.

Tal vez sería mejor para decidir sobre la docena de campos que son más importantes, ponerlas en la mesa 'principal'. Entonces grupo de los sensores de alguna manera lógica y ponerlos en varias mesas paralelas. Con la agrupación adecuada, es posible que no tiene que unirse a todas las mesas todo el tiempo.

¿Usted está indexando cualquiera de los valores? ¿Necesita buscar en ellos? Probablemente usted busca en fecha y hora?

Si necesita una gran cantidad de índices de columnas -. Despeje

Si necesita índice de unos pocos -. Ponerlos en la 'tabla principal

Aquí está la solución real (si aplica) ...

Si usted no necesita la amplia gama de sensores de índice, entonces no hacer columnas! Sí, has oído. En su lugar, les recogerá en JSON, comprimir el JSON, almacenarlo en un campo BLOB. Usted ahorrará una tonelada de espacio; que tendrá una sola tabla, con problemas de límites no columna; etc. Su aplicación va a descomprimir, y luego usar el JSON como una estructura. ¿Adivina qué? Puede tener una estructura - puede agrupar los sensores en matrices, cosas de niveles múltiples, etc., al igual que su aplicación le gustaría. Otra 'característica' - es de tipo abierto. Si agrega más sensores, que no es necesario modificar la tabla. JSON si flexibles de esa manera.

(La compresión es opcional;. Si su conjunto de datos es enorme, que le ayudará con el espacio en disco, por lo tanto, el rendimiento global)

Veo esto como un posible escenario en el mundo de grandes volúmenes de datos, en la que no puede ser la realización del tipo * de selección tradicional de consultas. Nos ocupamos de esto en el mundo del modelaje predictivo a nivel del cliente, donde se modela un cliente a través de miles de dimensiones (todas ellas tienen valores de 0 ó 1). Esta forma de almacenamiento hace que el modelo de la construcción aguas abajo actividades, etc. fácil cuando se tiene los factores de riesgo en la misma fila y la bandera de resultado en la misma fila, así .. Esto puede normalizarse desde un punto de almacenamiento con una estructura de padres e hijos, pero el modelo predictivo aguas abajo tendrá que convertir de nuevo en el esquema plana. Utilizamos corrimiento al rojo, que hace de almacenamiento columnar, por lo que sus columnas de 1000 cuando se carga seguridad de los datos, en realidad se almacenan en un formato de columnas ...

Hay un tiempo y lugar para este diseño. Absolutamente. La normalización no es la solución para todos los problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top