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

เพิ่มประสิทธิภาพคำสั่ง SELECT ใน MySQL ด้วย IN() แทน OR หลายเงื่อนไข

เมื่อต้องการกรองข้อมูลหลายค่าในคอลัมน์เดียวกัน การใช้ 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 Scan
  • IN() รองรับ Subquery ได้: WHERE col IN (SELECT ...)
  • ค่าที่ใช้ใน IN() ควรเป็น Constant หรือ Parameter เพื่อให้ Query Cache/Plan ใช้งานได้
  • สำหรับรายการเยอะมาก (>1000) ควรพิจารณา Temporary Table หรือ JOIN แทน