เมื่อต้องการกรองข้อมูลหลายค่าในคอลัมน์เดียวกัน การใช้ IN() มีประสิทธิภาพดีกว่า OR หลายตัว เพราะ MySQL สามารถใช้ Index ได้อย่างมีประสิทธิภาพ (Range optimization / Index lookup)
ตัวอย่างการใช้งาน
สร้างตารางลูกค้า:
mysql> create table DemoTable1618 (ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY, ClientName varchar(20), ClientEmailId varchar(30));
mysql> insert into DemoTable1618(ClientName,ClientEmailId) values('Chris Brown','Brown323@gmail.com'),('David Miller','MillerDavid@gmail.com'),('John Doe','998John_Doe@gmail.com'),('John Smith','999John_Smith@gmail.com'),('Adam Smith','Adam_Smith@gmail.com');
ข้อมูล:
+----------+--------------+-------------------------+ | ClientId | ClientName | ClientEmailId | +----------+--------------+-------------------------+ | 1 | Chris Brown | Brown323@gmail.com | | 2 | David Miller | MillerDavid@gmail.com | | 3 | John Doe | 998John_Doe@gmail.com | | 4 | John Smith | 999John_Smith@gmail.com | | 5 | Adam Smith | Adam_Smith@gmail.com | +----------+--------------+-------------------------+
คำสั่งใช้ IN() ค้นหาอีเมล 3 รายการ (เร็วกว่า OR)
mysql> select * from DemoTable1618 where ClientEmailId IN('998John_Doe@gmail.com','999John_Smith@gmail.com','MillerDavid@gmail.com');
ผลลัพธ์
+----------+--------------+-------------------------+ | ClientId | ClientName | ClientEmailId | +----------+--------------+-------------------------+ | 2 | David Miller | MillerDavid@gmail.com | | 3 | John Doe | 998John_Doe@gmail.com | | 4 | John Smith | 999John_Smith@gmail.com | +----------+--------------+-------------------------+
คำอธิบาย:
IN(value1, value2, ...)MySQL Optimizer จัดการเป็น Range scan บน Index ได้ดีWHERE col=val1 OR col=val2 OR col=val3อาจทำให้ Optimizer เลือก Full Table ScanIN()รองรับ Subquery ได้:WHERE col IN (SELECT ...)- ค่าที่ใช้ใน IN() ควรเป็น Constant หรือ Parameter เพื่อให้ Query Cache/Plan ใช้งานได้
- สำหรับรายการเยอะมาก (>1000) ควรพิจารณา Temporary Table หรือ JOIN แทน