คำตอบ: ไม่ใช่ Busy-Wait
MySQL SLEEP() ไม่ใช่ Busy-Wait มันเป็น System Call ที่ปล่อย CPU ให้ Process อื่นทำงาน (Sleep/Wait State) ไม่ได้วน Loop เช็คเวลาอย่างต่อเนื่อง
การใช้งาน SLEEP()
Syntax: SLEEP(seconds) - หยุดนิ่งเป็นจำนวนวินาทีที่ระบุ คืนค่า 0 เสมอเมื่อจบ
ตัวอย่าง
CREATE TABLE DemoTable(FirstName VARCHAR(100));
INSERT INTO DemoTable VALUES('John'), ('Adam'), ('Bob'), ('Chris'), ('Robert');
-- ใช้ SLEEP(10) ใน SELECT - จะหน่วง 10 วินาทีต่อแถว
SELECT SLEEP(10), FirstName FROM DemoTable;
ผลลัพธ์: ใช้เวลาทั้งหมด ~50 วินาที (5 แถว × 10 วินาที)
+-----------+-----------+
| SLEEP(10) | FirstName |
+-----------+-----------+
| 0 | John |
| 0 | Adam |
| 0 | Bob |
| 0 | Chris |
| 0 | Robert |
+-----------+-----------+
5 rows in set (50.00 sec)
กรณีใช้งานจริง
- Testing/Simulation: ทดสอบ Timeout, Deadlock, Replication Lag
- Rate Limiting: หน่วงเวลาระหว่าง Batch Processing
- Debugging: จำลอง Query ช้าเพื่อทดสอบ Application Handling
ข้อควรระวัง
- ไม่ควรใช้ใน Production Query ปกติ - จะทำให้ Connection ค้างนาน Block Thread Pool
- SLEEP() ทำงานต่อ Row - ถ้า SELECT 1000 rows SLEEP(1) = ค้าง 1000 วินาที
- Alternative: ใช้
SELECT ... FOR UPDATE SKIP LOCKEDหรือ Application-level Sleep แทน
เทคนิค Debug: จำลอง Slow Query
-- สร้าง View ที่มี SLEEP เพื่อทดสอบ Slow Query Log
CREATE VIEW slow_view AS
SELECT *, SLEEP(2) AS dummy FROM large_table;
-- แล้ว Query view นี้ จะช้าประมาณ 2 วินาทีต่อแถว