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

ใช้ IN() แทน OR หลายเงื่อนไขใน MySQL เพื่อประสิทธิภาพ


ปัญหาของ OR หลายเงื่อนไข

การใช้ OR หลายตัวใน WHERE clause ทำให้ Query ยากต่อการอ่าน และ Optimizer อาจไม่สามารถใช้ Index ได้อย่างมีประสิทธิภาพ

วิธีแก้: ใช้ IN()

IN() ทำงานเหมือน OR หลายตัวแต่:

  • อ่านง่ายกว่า สั้นกว่า
  • Optimizer จัดการได้ดีกว่า (ใช้ Index ได้)
  • รองรับ Subquery ได้

ตัวอย่างเปรียบเทียบ

1. สร้างตาราง

mysql> CREATE TABLE DemoTable (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> FirstName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.83 sec)

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable(FirstName) VALUES('John');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES('Adam');
Query OK, 1 row affected (0.27 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES('David');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES('Mike');
Query OK, 1 row affected (0.48 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES('Bob');
Query OK, 1 row affected (0.09 sec)

3. ใช้ IN() แทน OR

-- แทนที่จะเขียน: WHERE Id = 2 OR Id = 3 OR Id = 5
mysql> SELECT * FROM DemoTable WHERE Id IN(2,3,5);

ผลลัพธ์:

+----+-----------+
| Id | FirstName |
+----+-----------+
| 2  | Adam      |
| 3  | David     |
| 5  | Bob       |
+----+-----------+
3 rows in set (0.00 sec)

ประสิทธิภาพและ Best Practices

ด้าน OR หลายตัว IN()
ความยาวโค้ด ยาว สั้น
การอ่าน ยาก ง่าย
Index Usage อาจไม่ใช้ ใช้ได้ดี
รองรับ Subquery ไม่ได้ ได้
Parameter Binding ยุ่งยาก ง่าย (Prepared Statement)

ตัวอย่างขั้นสูง: IN กับ Subquery

-- หาลูกค้าที่มีออเดอร์ในปี 2023
SELECT * FROM Customers 
WHERE CustomerId IN (
    SELECT CustomerId FROM Orders 
    WHERE YEAR(OrderDate) = 2023
);

ข้อจำกัด

  • รายการใน IN() ควรไม่เกินหลายพันรายการ (Performance)
  • สำหรับรายการมาก ใช้ JOIN หรือ Temporary Table แทน
  • NULL ในรายการ IN() ต้องระวัง: IN (1, 2, NULL) อาจให้ผลไม่คาดคิด