Sto cercando di capire i requisiti di archiviazione per diversi motori di archiviazione. Ho questa tabella:Perché la dimensione della tabella InnoDB è molto più grande del previsto?
CREATE TABLE `mytest` (
`num1` int(10) unsigned NOT NULL,
KEY `key1` (`num1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Quando inserisco alcuni valori e quindi eseguire show table status;
ricevo il seguente:
+----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | mytest | InnoDB | 10 | Compact | 1932473 | 35 | 67715072 | 0 | 48840704 | 4194304 | NULL | 2010-05-26 11:30:40 | NULL | NULL | latin1_swedish_ci | NULL | | |
Avviso avg_row_length è 35. Sono sconcertato che InnoDB non fare un uso migliore degli spazi quando sto solo memorizzando un numero intero non nullable.
Ho eseguito questo stesso test su myISAM e per impostazione predefinita myISAM utilizza 7 byte per riga su questa tabella. Quando corro
ALTER TABLE mytest MAX_ROWS=50000000, AVG_ROW_LENGTH = 4;
causa che myISAM utilizza correttamente le righe di 5 byte.
Quando eseguo la stessa istruzione ALTER TABLE per InnoDB, avg_row_length non cambia.
Perché sarebbe necessaria una lunghezza avg_row_ così grande quando si memorizza solo un int con unsigned a 4 byte?
Ho appena letto che InnoDB utilizza lo spazio tabelle sia per i dati che per l'indice. questo ha senso e sembra che questo sarebbe il motivo per cui sto vedendo un così grande avg_row_length ... forse. Ho anche scoperto che ogni nodo foglia memorizza l'ID della transazione e il puntatore del rollback. Beh, non sto facendo uso di transazioni di per sé e quindi non ho alcuna utilità per questi dati. c'è un modo per non memorizzare questi valori? In qualsiasi modo posso usare InnoDB ma fare un uso un po 'migliore dello spazio di archiviazione? grazie! –
@alessandro: sì, il supporto alle transazioni aggiunge un po 'di overhead. Il fatto che tu non stia facendo uso di transazioni non significa che non vengano utilizzate: ad esempio, un thread ucciso durante un'operazione lunga 'UPDATE' eseguirà il rollback correttamente in 'InnoDB' ma non in' MyISAM'. Il supporto delle transazioni è il punto principale dell'utilizzo di 'InnoDB', se non ne hai bisogno, usa' MyISAM'. – Quassnoi
@Quassnoi: ho avuto l'impressione che MyISAM non sia "maturo" o pronto per la produzione come InnoDB ... forse è una paura infondata. Ci sono disagi che MyISAM mette in campo quando si tratta di eseguire il backup dei database oltre al fatto che MyISAM richiede un blocco totale del tavolo per garantire la coerenza. Non ho bisogno di transazioni e conserverò molti dati. Ci sono problemi noti con MyISAM che potrebbero causare il mancato utilizzo? –