innodb 更新存储的索引大小以及记录数
思路:
数据量极小,可以根据行数快速找出我需要的表~ 。

mysql8 存储过程解决方案 ,谨慎使用!!
建议本地测试使用 ,数据量大的别用!!
DELIMITER //
DROP PROCEDURE IF EXISTS FindAccurateNonEmptyTables //
CREATE PROCEDURE FindAccurateNonEmptyTables()
BEGIN
-- 1. 所有声明(DECLARE)语句集中放在开头
-- 声明变量用于存储表名
DECLARE v_table_name VARCHAR(255);
-- 声明游标,遍历目标数据库中的所有 BASE TABLE
DECLARE table_cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = @db_name
AND table_type = 'BASE TABLE';
-- 声明 NOT FOUND 处理器,用于退出循环
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @finished = 1;
-- 2. 所有可执行语句(SET, OPEN, LOOP 等)从这里开始
-- 定义要操作的数据库名称
SET @db_name = 'testdb';
-- 初始化变量
SET @finished = 0;
-- 打开游标
OPEN table_cursor;
-- 遍历所有表并执行 ANALYZE TABLE
analyze_loop: LOOP
FETCH table_cursor INTO v_table_name;
IF @finished = 1 THEN
LEAVE analyze_loop;
END IF;
-- 构造动态 SQL 语句:ANALYZE TABLE `db_name`.`table_name`
SET @sql = CONCAT('ANALYZE TABLE `', @db_name, '`.`', v_table_name, '`');
-- 准备并执行动态 SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
-- 关闭游标
CLOSE table_cursor;
-- 3. 执行最终查询:查询已更新统计信息的非空表
SELECT
table_schema AS DatabaseName,
table_name AS TableName,
table_rows AS RecordCount
FROM
information_schema.TABLES
WHERE
table_schema = @db_name
AND table_type = 'BASE TABLE'
AND table_rows > 0
ORDER BY
RecordCount DESC,
TableName ASC;
END //
DELIMITER ;
-- 4. 执行存储过程
CALL FindAccurateNonEmptyTables();
7万+

被折叠的 条评论
为什么被折叠?



