เมื่อต้องการ Query ข้อมูลหลายรายการพร้อมกันใน MySQL ให้มีประสิทธิภาพและรวดเร็วที่สุด ควรใช้ IN() Operator แทนการใช้ Loop หรือ OR หลายตัว เพราะ IN() ได้รับการเพิ่มประสิทธิภาพ (Optimize) โดยเฉพาะสำหรับการค้นหาค่าหลายค่าในคอลัมน์เดียวกัน
ตัวอย่างการใช้งาน IN() Operator
1. สร้างตารางตัวอย่าง
mysql> CREATE TABLE DemoTable1538 (
-> ClientId INT,
-> ClientName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.59 sec)
2. เพิ่มข้อมูลทดสอบ
mysql> INSERT INTO DemoTable1538 VALUES(101,'Chris'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO DemoTable1538 VALUES(102,'Robert'); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable1538 VALUES(103,'Bob'); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO DemoTable1538 VALUES(104,'Adam'); Query OK, 1 row affected (0.16 sec)
3. แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable1538;
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 101 | Chris | | 102 | Robert | | 103 | Bob | | 104 | Adam | +----------+------------+ 4 rows in set (0.00 sec)
4. Query ข้อมูลหลายค่าด้วย IN()
mysql> SELECT * FROM DemoTable1538 WHERE ClientId IN(101,103,104);
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 101 | Chris | | 103 | Bob | | 104 | Adam | +----------+------------+ 3 rows in set (0.00 sec)
ทำไม IN() เร็วกว่า OR หรือ Loop?
- IN(): MySQL จะแปลงเป็น Binary Search หรือ Hash Lookup ภายใน ได้ผลลัพธ์ใน O(log n) หรือ O(1)
- OR หลายตัว: ต้อง Evaluate ทีละเงื่อนไข ทำให้ช้าลงตามจำนวนเงื่อนไข
- Loop (Application Level): ส่ง Query หลายครั้ง มี Overhead ของ Network Round-trip
ข้อแนะนำ: ใช้ IN() สำหรับค่าที่ทราบล่วงหน้า และพิจารณาใช้ JOIN กับ Temporary Table/Derived Table หากมีค่ามากกว่าหลายร้อยรายการ