SELECT
t.TABLE_NAME,
-- t.table_type,
SUM(
CASE
WHEN c.DATA_TYPE = 'tinyint' THEN 1
WHEN c.DATA_TYPE = 'smallint' THEN 2
WHEN c.DATA_TYPE = 'mediumint' THEN 3
WHEN c.DATA_TYPE = 'int' THEN 4
WHEN c.DATA_TYPE = 'bigint' THEN 8
WHEN c.DATA_TYPE = 'float' THEN 4
WHEN c.DATA_TYPE = 'double' THEN 8
WHEN c.DATA_TYPE = 'decimal' THEN c.NUMERIC_PRECISION + c.NUMERIC_SCALE
WHEN c.DATA_TYPE IN ('char', 'varchar', 'binary', 'varbinary') THEN
c.CHARACTER_MAXIMUM_LENGTH * 4 -- utf8mb4编码每个字符最多4字节
+ IF(c.CHARACTER_MAXIMUM_LENGTH <= 255, 1, 2) -- var_length_column_extra_bytes
WHEN c.DATA_TYPE IN ('date', 'time') THEN 3
WHEN c.DATA_TYPE IN ('datetime', 'timestamp') THEN 5 + IFNULL(c.DATETIME_PRECISION, 0)
WHEN c.DATA_TYPE = 'year' THEN 1
ELSE 0
END
) AS Estimated_Max_Row_Size
FROM
information_schema.TABLES t
JOIN
information_schema.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
WHERE
t.TABLE_SCHEMA = 'your_table_schema_name'
AND t.table_type = 'BASE TABLE'
GROUP BY
t.TABLE_NAME
ORDER BY Estimated_Max_Row_Size DESC