Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

หาจำนวนแถวรวมทุกตารางข้าม Database ด้วย INFORMATION_SCHEMA ใน MySQL


สถานการณ์

มีตารางชื่อเดียวกัน (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: วัดขนาดก่อนย้าย