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

MySQL SLEEP() Function เป็น Busy-Wait หรือไม่? และการใช้งาน

คำตอบ: ไม่ใช่ 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

ข้อควรระวัง

  1. ไม่ควรใช้ใน Production Query ปกติ - จะทำให้ Connection ค้างนาน Block Thread Pool
  2. SLEEP() ทำงานต่อ Row - ถ้า SELECT 1000 rows SLEEP(1) = ค้าง 1000 วินาที
  3. 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 วินาทีต่อแถว