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

Truy vấn nhiều hàng hiệu quả trong MySQL bằng INDEX và mệnh đề IN

Để truy xuất nhiều hàng theo danh sách ID nhanh chóng, hãy kết hợp **index trên cột lọc** và mệnh đề IN (..., ...). MySQL sẽ dùng index để tìm từng giá trị (index range scan / ref access) thay vì quét toàn bảng.

Ví dụ minh họa

Tạo bảng có khóa chính (tự động index):

mysql> CREATE TABLE DemoTable1501 (
    -> Id INT NOT NULL PRIMARY KEY,
    -> URL TEXT
    -> );

Chèn dữ liệu:

mysql> INSERT INTO DemoTable1501 VALUES
    -> (101, 'www.facebook.com'),
    -> (110, 'www.google.com'),
    -> (220, 'www.gmail.com'),
    -> (350, 'www.youtube.com');

Truy vấn 3 ID cụ thể:

mysql> SELECT * FROM DemoTable1501 WHERE Id IN (101, 220, 350);

Kết quả (3/4 hàng):

+-----+------------------+
| Id  | URL              |
+-----+------------------+
| 101 | www.facebook.com |
| 220 | www.gmail.com    |
| 350 | www.youtube.com  |
+-----+------------------+

Chứng minh dùng Index: SHOW STATUS

mysql> SHOW STATUS LIKE 'Handler_%';

Kết quả quan trọng:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Handler_read_key  | 3     |  -- 3 lần đọc qua index (3 ID)
| Handler_read_next | 0     |
| Handler_read_rnd  | 0     |
+-------------------+-------+

Handler_read_key = 3 chứng tỏ MySQL dùng index (PRIMARY KEY) để tìm chính xác 3 giá trị, **không quét toàn bảng**.

Best practice

    Luôn tạo index trên cột thường dùng trong WHERE, JOIN, ORDER BY.
  • Dùng IN (val1, val2, ...) thay cho nhiều OR – optimizer xử lý tốt hơn.
  • Giới hạn số lượng giá trị trong IN (khuyên < 1000) để tránh làm chậm optimizer.
  • Với danh sách lớn, cân nhắc JOIN với bảng tạm hoặc VALUES ROW() (MySQL 8.0+).