Sử dụng INFORMATION_SCHEMA.TABLES để lặp qua các bảng, hoặc truy vấn tổng hợp như SUM(TABLE_ROWS).
Tổng số hàng tất cả bảng trong database hiện tại
mysql> SELECT SUM(TABLE_ROWS) AS Total FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE();
+-------+ | Total | +-------+ | 1666 | +-------+
Lưu ý về TABLE_ROWS
- InnoDB: Giá trị ước lượng (estimated), không chính xác 100%
- MyISAM: Chính xác
- Để chính xác:
SELECT COUNT(*) FROM table_namecho từng bảng
Liệt kê tất cả bảng với số hàng
SELECT TABLE_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY TABLE_ROWS DESC;
Thực thi truy vấn cho từng bảng (Dynamic SQL)
MySQL không hỗ trợ vòng lặp trực tiếp trong SQL thuần. Cần:
1. Prepared Statement + Cursor (trong Procedure)
DELIMITER //
CREATE PROCEDURE ProcessAllTables()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tname VARCHAR(64);
DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO tname;
IF done THEN LEAVE read_loop; END IF;
SET @sql = CONCAT('ANALYZE TABLE `', tname, '`');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
2. Sinh SQL từ client (Python, Bash, v.v.)
# Bash
mysql -N -e "SELECT CONCAT('ANALYZE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mydb'" | mysql mydb
Các tác vụ thường gặp cho tất cả bảng
ANALYZE TABLE— cập nhật thống kê indexOPTIMIZE TABLE— defragmentCHECK TABLE— kiểm tra lỗiALTER TABLE ... ENGINE=InnoDB— chuyển engine