เมื่อต้องการรัน Query เดียวที่ครอบคลุมทุกตารางใน Database (เช่น นับแถวรวมทั้ง DB) ให้ Query INFORMATION_SCHEMA.TABLES ซึ่งเก็บ Metadata ของทุกตาราง
Syntax: นับแถวรวมทุกตารางใน Database ปัจจุบัน
SELECT SUM(TABLE_ROWS) AS Total FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE();
ผลลัพธ์ตัวอย่าง
+-------+ | Total | +-------+ | 1666 | +-------+
คำอธิบาย
INFORMATION_SCHEMA.TABLES- View เมตาดาต้าตารางทั้งหมดTABLE_SCHEMA- ชื่อ Database (Schema)DATABASE()- ฟังก์ชันคืน Database ปัจจุบันTABLE_ROWS- จำนวนแถวประมาณการ (Estimated) สำหรับ InnoDBSUM(TABLE_ROWS)- รวมจำนวนแถวทุกตาราง
ข้อควรระวัง: TABLE_ROWS เป็นประมาณการ
- InnoDB: ประมาณการ (Estimate) ไม่ใช่ Exact Count
- MyISAM: Exact (เก็บไว้ใน Header)
- ต้องการ Exact Count:
SELECT COUNT(*) FROM table_nameต่อตาราง
Query ที่มีประโยชน์อื่นๆ
รายชื่อตาราง + จำนวนแถว + Engine + Size
SELECT
TABLE_NAME,
ENGINE,
TABLE_ROWS,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS size_mb
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;
หาตารางว่าง (0 Rows)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_ROWS = 0;
สร้าง Dynamic SQL สำหรับทุกตาราง
SELECT CONCAT('ANALYZE TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`;') AS sql_cmd
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_db';
Dynamic SQL จริง (ต้องใช้ Prepared Statement)
SET @sql = (SELECT GROUP_CONCAT(CONCAT('ANALYZE TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`') SEPARATOR '; ')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE());
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
สิทธิ์
- ต้องมี
SELECTบนINFORMATION_SCHEMA - User ปกติเข้าถึงได้ (Metadata Visibility ตามสิทธิ์)