Domanda

Ho una tabella con le colonne e 1699 quando sto cercando di inserire più colonne ricevo,

Codice errore: 1117. Troppi colonne

In questa tabella ho solo 1000 righe. Per me la cosa più importante è il numero di colonne. Ci sono limitazioni sul tavolo? Voglio creare 2000 colonne. È possibile?

È stato utile?

Soluzione

Perché si deve creare una tabella con anche 20 colonne, per non parlare di 2000 ???

Assegnato dati, denormalizzati può evitare di dover fare JOIN per recuperare molte colonne di dati. Tuttavia, se si dispone di più di 10 colonne, si dovrebbe fermarsi e riflettere su ciò che sarebbe accaduto sotto il cofano durante il recupero dei dati.

Se un 2000 subisce tavolo colonna SELECT * FROM ... WHERE, si potrebbe generare grandi tabelle temporanee durante il trattamento, il recupero colonne che sono inutili, e la creazione di molti scenari in cui i pacchetti di comunicazione (max_allowed_packet ) sarebbe spinto al limite su ogni query.

Nei miei primi giorni come sviluppatore, ho lavorato presso una società di nuovo nel 1995, dove è stato il DB2 RDBMS principale. La società ha avuto un unico tavolo che era di 270 colonne, decine di indici, e problemi di prestazioni avuto il recupero dei dati. Hanno contattato IBM e aveva consulenti guardare oltre l'architettura del loro sistema, compreso questo tavolo monolitico. La società è stato detto: "Se non lo fai normalizzare questa tabella nei prossimi 2 anni, DB2 fallirà su query facendo Stage2 Processing (qualsiasi query che richiede l'ordinamento su colonne non indicizzate)." Questo è stato detto ad un-trilioni di più società di dollari, per normalizzare una tabella di 270 colonne. Quanto più una tabella di colonna del 2000.

In termini di mysql, si dovrebbe compensare tale disegno male da opzioni paragonabili a DB2 Stage2 Processing impostazione. In questo caso, le opzioni sarebbero

tweeking queste impostazioni per compensare la presenza di decine, centinaia lasciare da solo, di colonne funziona bene se si dispone di TB di RAM.

Questo problema si moltiplica geometricamente se si utilizza InnoDB come si avrà a che fare con la MVCC (Multiversion Controllo della concorrenza) cercando di tonnellate protette di colonne con ogni SELECT, UPDATE e DELETE attraverso l'isolamento delle transazioni.

Conclusione

Non v'è alcun sostituto o cerotto che può fare per cattivo design. Si prega, per il bene della vostra sanità mentale, in futuro, normalizzare quel tavolo oggi !!!

Altri suggerimenti

Ho problemi a nulla immaginando dove il modello di dati potrebbe legittimamente contenere 2000 colonne di una tabella correttamente normalizzata.

La mia ipotesi è che probabilmente stai facendo una sorta di "riempire gli spazi vuoti" schema denormalizzato, dove si sta effettivamente la memorizzazione di tutti i diversi tipi di dati in quella tabella, e invece di rompere i dati fuori in tabelle separate e rendendo le relazioni, hai vari settori che registrano ciò che "tipo" di dati vengono memorizzati in una determinata riga, e il 90% dei campi sono nulli. Anche allora, però, di voler ottenere a 2000 colonne ... accidenti.

La soluzione al vostro problema è quello di ripensare il proprio modello di dati. Se sei memorizzare una grande pila di dati chiave / valore che è associato con un determinato record, perché non modellare in quel modo? Qualcosa di simile:

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>
);

Poi, per ottenere tutte le voci sensore associato con un dato record di "master", si può semplicemente SELECT sensor_id,value FROM sensor_readings WHERE master_id=<some master ID>. Se avete bisogno di ottenere i dati per un record nella tabella master insieme a tutti i dati del sensore per il record, è possibile utilizzare un join:

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>

E poi si unisce ulteriormente se avete bisogno di dettagli di ciò che ogni sensore è.

Si tratta di un sistema di misurazione con 2000 sensori

ignorare tutti i commenti che gridano sulla normalizzazione - ciò che si sta chiedendo che potrebbe essere il design sensibile database (in un mondo ideale) e perfettamente normalizzata, è solo molto insolito, e come sottolineato altrove RDBMS di solito semplicemente non progettato per questo molte colonne.

Anche se non stanno colpendo il MySQL duro limite , uno degli altri fattori di cui il collegamento è probabilmente impedendo di andare più elevato

Come altri suggeriscono, si potrebbe ovviare a questa limitazione da avere una tabella figlio con id, sensor_id, sensor_value, o più semplicemente, si potrebbe creare una seconda tabella per contenere solo le colonne che non si adatta nella prima (e utilizzare lo stesso PK)

MySQL 5.0 Limiti column-count (enfasi aggiunta):

Esiste un limite fisico di 4096 colonne per tabella , ma il massimo effettiva può essere inferiore a una determinata tabella. Il limite esatto dipende da diversi fattori interagenti.

  • Ogni tabella (indipendentemente dal motore di archiviazione) ha una dimensione di riga massima di 65.535 byte. motori stoccaggio possono inserire i vincoli aggiuntivi questo limite, riducendo la dimensione massima delle righe efficace.

    La dimensione massima delle righe limita il numero (e dimensione) delle colonne perché la lunghezza totale di tutte le colonne non può superare questa dimensione.

...

motori di storage individuali potrebbero imporre restrizioni aggiuntive che contano colonna della tabella limite. Esempi:

  • InnoDB consente fino a 1000 colonne.

In primo luogo un po 'più in fiamme, poi una vera e propria soluzione di ...

Io per lo più d'accordo con le fiamme già gettati voi.

Non sono d'accordo con il valore-chiave normalizzazione. Query finiscono per essere orribile; prestazioni ancora peggio.

Un modo 'semplice' per evitare il problema immediato (limitazione del numero di colonne) è 'verticalmente partizione' i dati. Avete, diciamo, 5 tavoli con 400 colonne ciascuna. Avrebbero tutti hanno la stessa chiave primaria, tranne uno potrebbe avere essendo AUTO_INCREMENT.

Forse meglio sarebbe per decidere sui campi dozzina che sono più importanti, metterli nella tabella 'principale'. Poi gruppo i sensori in qualche modo logico e metterli in diverse tabelle parallele. Con la corretta raggruppamento, non potrebbe essere necessario unire tutti i tavoli per tutto il tempo.

Stai indicizzando uno dei valori? Avete bisogno di cercare su di loro? Probabilmente si cerca su datetime?

Se avete bisogno di un sacco di indice di colonne -. Punt

Se avete bisogno di indicizzare alcuni -. Metterli nella 'tabella principale

Ecco la vera soluzione (se si applica) ...

Se non avete bisogno della vasta gamma di sensori indicizzati, allora non rendere le colonne! Sì, mi avete sentito. Invece, li raccolgono in JSON, comprimere il JSON, memorizzarlo in un campo BLOB. Potrai risparmiare un sacco di spazio; si avrà un solo tavolo, con problemi di limite non colonna; ecc L'applicazione sarà decomprimere, e quindi utilizzare il JSON come una struttura. Indovina un po? Si può avere la struttura - è possibile raggruppare i sensori in array, roba multilivello, ecc, proprio come la vostra applicazione vorrebbe. Un altro 'caratteristica' - è a tempo indeterminato. Se si aggiungono più sensori, non è necessario per modificare la tabella. JSON se flessibile, in quel modo.

(compressione è facoltativo;. Se il set di dati è enorme, aiuterà con lo spazio su disco, quindi le prestazioni complessive)

Io vedo questo come un possibile scenario nel mondo dei dati di grandi, in cui non si può essere di eseguire la selezione tipo tradizionale * di query. Abbiamo a che fare con questo in tutto il mondo modellazione predittiva ad un livello di cliente in cui modelliamo un cliente attraverso migliaia di quote (tutti loro hanno valori di 0 o 1). Questo modo di memorizzazione rende il modello a valle attività edilizia ecc facile quando si hanno i fattori di rischio nella stessa riga e la bandiera esito nella stessa riga come pure .. Questo può essere normalizzata da un punto di stoccaggio con una struttura padre-figlio, ma il modello predittivo a valle avrà bisogno di convertirlo nuovamente dentro lo schema piatta. Usiamo redshift che fa stoccaggio colonnare, in modo che le colonne 1000+ quando si carica il backup dei dati, in realtà sono memorizzati in un formato a colonne ...

C'è un tempo e il luogo per questo disegno. Assolutamente. La normalizzazione non è la soluzione per ogni problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top