สถานการณ์
มีตารางชื่อเดียวกัน (DemoTable1568) อยู่ใน Database หลายตัว (web, sample) ต้องการหาจำนวนแถวรวมทั้งหมด
วิธีแก้: Query INFORMATION_SCHEMA.TABLES
ใช้ SUM(TABLE_ROWS) กรองด้วย TABLE_NAME และ TABLE_SCHEMA
ตัวอย่างการใช้งาน
1. สร้างตารางใน Database 'web'
mysql> CREATE TABLE DemoTable1568 (
-> Name VARCHAR(20)
-> );
Query OK, 0 rows affected (0.61 sec)
mysql> INSERT INTO DemoTable1568 VALUES('Chris'), ('Bob'), ('David');
Query OK, 3 rows affected (0.14 sec)
2. สลับไป Database 'sample' สร้างตารางชื่อเดียวกัน
mysql> USE sample;
Database changed
mysql> CREATE TABLE DemoTable1568 (
-> Id INT
-> );
Query OK, 0 rows affected (0.99 sec)
mysql> INSERT INTO DemoTable1568 VALUES(101), (102), (103), (104);
Query OK, 4 rows affected (0.14 sec)
3. หาจำนวนแถวรวมทั้งสอง Database
mysql> SELECT SUM(TABLE_ROWS) AS TotalNumberOfRows
-> FROM INFORMATION_SCHEMA.TABLES
-> WHERE TABLE_NAME = 'DemoTable1568';
ผลลัพธ์:
+-------------------+ | TotalNumberOfRows | +-------------------+ | 7 | +-------------------+ 1 row in set (0.19 sec)
ข้อควรระวังสำคัญ: TABLE_ROWS เป็นค่าประมาณ
- InnoDB:
TABLE_ROWSเป็น Estimate (ประมาณการ) ไม่ใช่ Exact Count - MyISAM/MEMORY: นับได้แม่นยำ
- สำหรับ Exact Count ต้องใช้
SELECT COUNT(*)ตรงตาราง
วิธีได้ Exact Count ข้าม Database
1. Dynamic SQL (Prepared Statement)
SELECT CONCAT('SELECT SUM(cnt) FROM (',
GROUP_CONCAT(
CONCAT('SELECT COUNT(*) AS cnt FROM `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`')
SEPARATOR ' UNION ALL '
),
') AS t') INTO @sql
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'DemoTable1568';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
2. Application Level (แนะนำ)
Query COUNT(*) จากแต่ละ Database แล้วรวมใน Application Code
คอลัมน์สำคัญใน INFORMATION_SCHEMA.TABLES
| Column | คำอธิบาย |
|---|---|
| TABLE_SCHEMA | Database Name |
| TABLE_NAME | Table Name |
| TABLE_TYPE | BASE TABLE / VIEW |
| ENGINE | Storage Engine |
| TABLE_ROWS | ประมาณจำนวนแถว |
| AVG_ROW_LENGTH | ขนาดเฉลี่ยต่อแถว (Bytes) |
| DATA_LENGTH | ขนาดข้อมูล (Bytes) |
| INDEX_LENGTH | ขนาด Index (Bytes) |
กรณีการใช้งานจริง
- Capacity Planning: ประเมินขนาด Database ทั้ง Cluster
- Multi-tenant: นับข้อมูลรวมทุก Tenant
- Audit: ตรวจสอบ Table Row Count ไม่คาดคิด
- Migration: วัดขนาดก่อนย้าย