Skip to main content

MySQL Cookbook

table_size

CREATE VIEW table_size AS
SELECT
table_schema AS table_schema,
table_name AS table_name,
table_rows AS row_estimate,
data_length + index_length AS total_bytes,
data_length AS table_bytes,
index_length AS index_bytes,
data_free AS free_space,
CONCAT(ROUND((data_length + index_length) / 1024 / 1024, 2), ' MB') AS total_pretty,
CONCAT(ROUND(data_length / 1024 / 1024, 2), ' MB') AS table_pretty,
CONCAT(ROUND(index_length / 1024 / 1024, 2), ' MB') AS index_pretty
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
ORDER BY
total_bytes DESC;

analyze_small_tables

DELIMITER $$

CREATE PROCEDURE analyze_small_tables()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE schema_name VARCHAR(255);
DECLARE table_name VARCHAR(255);
DECLARE cur CURSOR FOR
SELECT table_schema, table_name
FROM table_size
WHERE table_schema not in ('information_schema', 'performance_schema', 'mysql','sys')
AND row_estimate < 10;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;

read_loop: LOOP
FETCH cur INTO schema_name, table_name;
IF done THEN
LEAVE read_loop;
END IF;

SET @stmt = CONCAT('ANALYZE TABLE ', schema_name, '.', table_name);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;

CLOSE cur;
END$$

DELIMITER ;