Estoy encontrando cuál es la mejor manera de estimar el tamaño de una tabla para la que he estudiado muchos blogs y foros pero no puedo encontrar ninguna respuesta precisa
Por ejemplo, tenemos una tabla Ciudad con motor InnoDB , digamos que en el futuro (en el próximo 1 año) tendrá 1 millón de registros, ¿cuál será el tamaño de datos estimado y el tamaño de índice de esa tabla en este período?
mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | MUL | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)
ACTUALIZAR
¿Cuál será el límite superior estimado (tamaño máximo de la tabla) con 1 millón de registros y cómo podemos estimarlo?
Respuestas:
Dada la descripción de la tabla, veo
Para un millón de filas, eso sería 77,000,000 bytes (73.43 MB)
En cuanto a la medición de la tabla, para una tabla dada mydb.mytable, puede ejecutar esta consulta
Para medir todas las tablas agrupadas por Motor de base de datos y almacenamiento
Ejecute estas consultas y podrá realizar un seguimiento de los cambios en el uso de la base de datos / disco del motor.
Darle una oportunidad !!!
fuente
CHAR
longitudes deben multiplicarse por 3 si es asíCHARSET utf8
. La sobrecarga completa puede estimarse duplicando o triplicando el cálculo.ALTER TABLE ... ENGINE=InnoDB;
) para obtener una proporción precisa. Es posible que el esfuerzo no valga la pena.Si está utilizando tablas InnoDB, puede obtener el tamaño de los datos / índices individuales
mysql.innodb_index_stats
. La estadística de "tamaño" contiene la respuesta, en páginas, por lo que debe multiplicarla por el tamaño de página, es decir, 16 KB de forma predeterminada .El índice PRIMARIO son los datos en sí.
fuente
Al ejecutar esta consulta, puede obtener el tamaño utilizado para
Data
yIndex
de una tabla. Puede verificar este tamaño con el número de filas y predecir 1 millón de filas.fuente
Si aún no tiene datos, aquí hay algunos consejos. Lo siguiente se aplica a InnoDB. (MyISAM es mucho más simple y más pequeño).
No lo use
CHAR
para columnas de longitud variable. QueCHARACTER SET
estas usando Ascii necesita un byte por carácter; utf8mb4 necesita entre 1 y 4.Total = aproximadamente 80 bytes.
Multiplique los 80 por entre 2 y 3 para tener en cuenta varios gastos generales. Lo más probable es que la tabla de filas de 1M tenga entre 160 MB y 240 MB.
Para medir un solo índice, por ejemplo
CountryCode
de 3 bytes:Notas:
Solo se deben calcular los nodos hoja (de BTrees); la sobrecarga para los nodos no hoja es típicamente del 1%.
El
PRIMARY KEY
se "agrupa" con los datos, por lo que no es necesario calcularlo.Si no tiene una PK explícita, debe agregar 6 bytes al tamaño de la fila para permitir la PK fabricada.
ROW_FORMAT = COMPRESSED
le da una contracción de 2: 1. (Esto no es tan bueno como la tasa de compresión típica de zip (etc.) de 3: 1).SHOW TABLE STATUS LIKE "tablename";
es la forma rápida de calcular el tamaño 'real'. VerData_length
para datos y PK;Index_length
para índices secundarios yData_free
para algunas otras cosas.Es raro
Index_length
que excedaData_length
. Sin embargo, no está "mal" que eso suceda.fuente
Es tedioso Pero los detalles están en los documentos .
Para ser lo más preciso posible, lo que rara vez es necesario, también deberá leer sobre la estructura de la tabla y la estructura del índice.
Si estuviera en su lugar, construiría la tabla, la llenaría con un millón de filas de datos de prueba y mediría el cambio de tamaño. Dependiendo de su aplicación, es posible que también deba tener en cuenta el tamaño de los archivos de registro de transacciones.
fuente