Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Áp dụng truy vấn MySQL cho mỗi bảng trong một database?

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_name cho 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ê index
  • OPTIMIZE TABLE — defragment
  • CHECK TABLE — kiểm tra lỗi
  • ALTER TABLE ... ENGINE=InnoDB — chuyển engine