วิธีที่ง่ายที่สุด: COUNT(*)
SELECT COUNT(*) FROM table_name; คืนค่าจำนวนแถวทั้งหมด (รวม NULL rows)
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1575 (
-> FirstName VARCHAR(20)
-> );
Query OK, 0 rows affected (1.00 sec)
2. เพิ่มข้อมูล 4 แถว
mysql> INSERT INTO DemoTable1575 VALUES('Chris'), ('Bob'), ('Adam'), ('Robert');
Query OK, 4 rows affected (...)
3. นับจำนวนแถว
mysql> SELECT COUNT(*) FROM DemoTable1575;
ผลลัพธ์:
+----------+ | COUNT(*) | +----------+ | 4 | +----------+ 1 row in set (0.03 sec)
COUNT(*) vs COUNT(column) vs COUNT(1)
| Syntax | นับอะไร | NULL Handling | Performance (InnoDB) |
|---|---|---|---|
| COUNT(*) | ทุกแถว | นับ NULL ด้วย | เร็วที่สุด (Optimized) |
| COUNT(1) | ทุกแถว | นับ NULL ด้วย | เท่า COUNT(*) |
| COUNT(column) | แถวที่ Column ≠ NULL | ไม่นับ NULL | ช้ากว่า (ต้องอ่าน Column) |
| COUNT(DISTINCT col) | Distinct Values | ไม่นับ NULL | ช้ามาก (Temp Table) |
InnoDB และ COUNT(*)
- InnoDB ไม่เก็บ Row Count ไว้ (MVCC, Transaction Isolation)
SELECT COUNT(*)ต้อง Scan Index (Primary Key หรือ Secondary Index ที่เล็กที่สุด)- ตารางใหญ่ (>10M rows) อาจช้า → ใช้ Trigger/Maintained Counter Table
วิธีเร็วขึ้นสำหรับตารางใหญ่
1. ใช้ Secondary Index ที่เล็กที่สุด
-- MySQL จะเลือก Index ที่เล็กที่สุดอัตโนมัติ -- สร้าง Index บน Column เล็ก (TINYINT) เพื่อ COUNT เร็วขึ้น ALTER TABLE BigTable ADD INDEX idx_tiny (TinyCol);
2. Maintained Counter Table
CREATE TABLE TableStats (TableName VARCHAR(64) PRIMARY KEY, RowCount BIGINT); -- Trigger ON INSERT/DELETE UPDATE TableStats
3. INFORMATION_SCHEMA (ประมาณการ)
SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db' AND TABLE_NAME = 'table';
กรณีการใช้งานจริง
- Pagination: คำนวณ Total Pages
- Dashboard: แสดงจำนวน Users/Orders/Products
- Health Check: ตรวจสอบ Table ไม่ว่าง
- Data Quality: เปรียบเทียบ Expected vs Actual Count