Problema:
¿Hay alguna forma de calcular el número de bytes ocupados por la creación de la tabla? Sé que puede obtener información de information_schema.tables, pero esa información no es lo suficientemente precisa.
Lo que realmente se requiere es el número de bytes de acuerdo con la definición de la tabla para innodb únicamente y la clasificación también podría considerarse como utf-8-general-ci
Por ejemplo, una prueba de tabla es la siguiente
crear prueba de tabla
(
col1 varchar (25),
col2 int,
col3 varchar (3),
col4 char (15),
col5 datetime
);
Ahora requeriría saber el tamaño total de la fila que se puede acumular en una fila de acuerdo con los tipos de columnas de la tabla.
Encontré algún tipo de solución similar en MSSQL pero necesito su versión de MySQL
Script para estimar tamaños de fila para cualquier tabla
Cualquier ayuda es muy apreciada.
fuente
Respuestas:
Después de mucho pensar e investigar, encontré una respuesta que realmente ayudó a lograr lo que se requería. Es un script perl y el enlace de referencia es
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
Gracias a todos por la gran ayuda.
fuente
-uUser -pPass
a las líneas de comando mysql y mysqldump en el script (o intente en su--defaults-extra-file=/etc/mysql/debian.cnf
lugar en Ubuntu / Debian) y ejecútelo con una base de datos como primer argumento comoperl test.pl mydatabase
Debe conocer el tamaño en bytes de cada campo de acuerdo con el tipo de datos ( referencia de MySQL aquí ), luego sumar estos valores juntos.
fuente
Paso 1:
20 caracteres ingleses: 2 + 1 * 20
20 caracteres medio-orientales / eslavos: 2 + 2 * 20
20 caracteres asiáticos: 2 + 3 * 20
20 caracteres emoji: 2 + 4 * 20 (y usted necesita
utf8mb4
)Paso 2: Súmalos.
Paso 3: multiplique por algún lugar entre 2 y 3 para permitir la sobrecarga de InnoDB. He descubierto que ese factor generalmente funciona. (Pero no para tablas pequeñas, y no necesariamente para tablas particionadas).
No veo ninguna razón para tomar el tamaño máximo de cada columna.
Puede acercarse
SHOW TABLE STATUS
o losinformation_schema
datos equivalentes :Paso 1:
SELECT COUNT(*)
- us esto en lugar deRows
Paso 2: Obtén
Data_length + Index_length + Data_free
Paso 3: Divide.
fuente
SELECT AVG(LENGTH(varchar_col))
- Nota:LENGTH
ya es bytes ; no es necesario multiplicar por 2/3/4. (CHAR_LENGTH
obtiene la longitud en caracteres.)Hice un script bash aproximado para calcular el tamaño de la fila y advertir si supera el límite según el esquema:
fuente
Ya hay algunas preguntas de este tipo, por ejemplo, esta: Cómo estimar / predecir el tamaño de los datos y el tamaño del índice de una tabla en MySQL
Una diferencia entre esa pregunta y su tabla es la presencia de cadenas de longitud variable en la suya: recuerde tener en cuenta el tamaño máximo que pueden ser.
También recuerde que desde la versión 5 en adelante,
varchar(25)
son hasta 25 caracteres, no hasta 25 bytes, por lo que si es probable que vea caracteres no ASCII en sus cadenas, el tamaño de la columna podría aumentar hasta un máximo de 100 bytes porque algunos caracteres toman cuatro bytes para representar, por ejemplo, "montón de emojis de caca" (que, te digo, no existe), si tu navegador actual + fuente lo admite parece: 💩) es 0xF0 0x9F 0x92 0xA9. Antes de v5, mySQL contaba bytes, no caracteres al especificar longitudes de tipo de cadena.Editar con respecto a la automatización
En términos de automatización del proceso, debe poder derivar toda la información necesaria de las
INFORMATION_SCHEMA
tablas de manera similar al script que ha encontrado para MS SQL Server. Consulte https://dev.mysql.com/doc/refman/5.0/en/information-schema.html para obtener documentación que lo cubra.fuente
INFORMATION_SCHEMA
tablas deben incluir la información que necesita. Consulte dev.mysql.com/doc/refman/5.0/en/information-schema.html para obtener documentación que lo cubra.