Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tối ưu truy vấn MySQL: dùng IN() thay vì nhiều OR để tận dụng index

Mệnh đề IN() được MySQL tối ưu hóa nội bộ (sử dụng binary search trên danh sách giá trị đã sort) và tận dụng index tốt hơn so với chuỗi OR dài.

Ví dụ minh họa

Tạo bảng có index trên ClientEmailId:

mysql> CREATE TABLE DemoTable1618 (
    ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ClientName VARCHAR(20), ClientEmailId VARCHAR(30)
);

Chèn dữ liệu:

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');

Truy vấn dùng IN() (tận dụng index):

mysql> SELECT * FROM DemoTable1618
    WHERE ClientEmailId IN('998John_Doe@gmail.com', '999John_Smith@gmail.com', 'MillerDavid@gmail.com');

Kết quả:

+----------+--------------+-------------------------+
| ClientId | ClientName   | ClientEmailId           |
+----------+--------------+-------------------------+
| 2        | David Miller | MillerDavid@gmail.com   |
| 3        | John Doe     | 998John_Doe@gmail.com   |
| 4        | John Smith   | 999John_Smith@gmail.com |
+----------+--------------+-------------------------+

Tại sao IN() nhanh hơn OR?

  • MySQL sắp xếp danh sách giá trị IN() và dùng binary search (O(log n) thay vì O(n)).
  • Optimizer nhận diện IN() dễ dàng hơn để dùng index range scan.
  • Code ngắn gọn, dễ đọc, dễ bảo trì.

Lưu ý: Danh sách IN() không nên quá lớn (hàng nghìn giá trị) - cân nhắc JOIN với bảng tạm hoặc bảng giá trị.