在 MySQL 中查看表字段的占用空间大小,可以通过以下两种方法实现:
方法 1:通过 SHOW TABLE STATUS
查看表整体大小
SHOW TABLE STATUS LIKE '表名';
- 输出字段:
Data_length
(数据大小)和 Index_length
(索引大小),单位是 字节。 - 特点:仅显示表的整体空间占用,无法细化到单个字段。
步骤 1:查看字段的数据类型
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '表名';
- 作用:获取字段的存储类型,根据数据类型估算固定长度字段的占用空间。
步骤 2:计算可变长度字段的实际占用
对 VARCHAR
、TEXT
等动态字段,运行以下查询估算实际存储大小:
SELECT
AVG(LENGTH(字段名)) AS 平均字节数,
COUNT(*) AS 总行数
FROM 表名;
步骤 3:结合数据类型的固定大小
数据类型 | 存储大小 (字节) |
---|
TINYINT | 1 |
SMALLINT | 2 |
INT | 4 |
BIGINT | 8 |
FLOAT | 4 |
DOUBLE | 8 |
DATE | 3 |
DATETIME | 8 |
TIMESTAMP | 4 |
CHAR(N) | N(字符集影响实际字节) |
VARCHAR(N) | 实际长度 + 1 或 2 字节 |
方法 3:使用存储过程自动计算
DELIMITER //
CREATE PROCEDURE CalculateColumnSizes(IN tableName VARCHAR(255))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE colName VARCHAR(255);
DECLARE colType VARCHAR(255);
DECLARE cur CURSOR FOR
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = tableName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO colName, colType;
IF done THEN
LEAVE read_loop;
END IF;
SET @query = CONCAT(
'SELECT AVG(LENGTH(`', colName, '`)) AS avg_length, ',
'SUM(LENGTH(`', colName, '`)) AS total_bytes ',
'FROM ', tableName, ';'
);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
-- 调用存储过程
CALL CalculateColumnSizes('表名');
注意事项
- 动态字段的存储开销:
VARCHAR
需要额外 1-2 字节存储长度信息。 - 字符集影响:UTF8 每个字符占用 3 字节,UTF8MB4 占用 4 字节。
- NULL 值:可为 NULL 的字段会占用 1 位存储(每 8 个字段打包成 1 字节)。
- 行格式:InnoDB 的
COMPACT
或 DYNAMIC
格式会影响存储效率。
总结
- 固定长度字段:通过数据类型直接计算。
- 可变长度字段:通过
AVG(LENGTH(column))
估算。 - 实际存储可能因碎片、索引、行格式等因素与理论值存在差异。