CodeGym /Các khóa học /SQL SELF /Làm quen với chỉ mục

Làm quen với chỉ mục

SQL SELF
Mức độ , Bài học
Có sẵn

Chắc bạn đã từng nghe về chỉ mục rồi. Hôm nay tụi mình sẽ đào sâu hơn để bạn hiểu hết mấy chi tiết về cách nó hoạt động. Chỉ mục là thứ cực kỳ xịn, nó có thể tăng tốc truy vấn của bạn lên hàng trăm, thậm chí hàng ngàn lần luôn đó. Bạn sẽ thích cho mà xem. Nhưng chỉ mục là gì nhỉ?

Hãy tưởng tượng bạn đang tìm một cuốn sách cần thiết trong một thư viện siêu to. Nếu không có thứ tự gì để tìm thì chắc bạn phải mất cả đời mới xong. Để tăng tốc, sách thường được sắp xếp theo bảng chữ cái hoặc theo thể loại. Chỉ mục trong cơ sở dữ liệu cũng hoạt động kiểu như vậy đó.

Về mặt lý thuyết chỉ mục — là một cấu trúc dữ liệu phụ đặc biệt, được tạo ra để tìm kiếm dòng trong bảng cho nhanh. Nó giúp giảm số lượng dữ liệu bạn phải xem qua để tìm thông tin cần thiết.

Ở một khía cạnh nào đó, chỉ mục giống như mục lục trong bách khoa toàn thư, nếu coi cả cuốn sách là một bảng.
Thay vì phải đọc hết bách khoa toàn thư từ đầu đến cuối, bạn dùng mục lục để nhảy thẳng đến trang cần thiết.

Ví dụ, bảng employees có 100 nghìn nhân viên. Nếu bạn tìm nhân viên có họ "Мин", không có chỉ mục thì phải xem từng dòng một (rất lâu). Có chỉ mục thì tìm nhanh hơn nhiều, vì Postgres biết chỗ cần tìm rồi.

Chỉ mục hoạt động thế nào?

Để hiểu tại sao chỉ mục tăng tốc truy vấn, bạn cần biết nó làm gì ở phía sau hậu trường. Chỉ mục được tạo dựa trên một hoặc nhiều cột của bảng và tổ chức dữ liệu thành cấu trúc dễ tìm kiếm.

Chỉ mục trong PostgreSQL thường dùng cấu trúc dữ liệu B-Tree (Cây cân bằng). Nó hoạt động như này nè:

  1. Tạo chỉ mục: dữ liệu từ các cột được chọn sẽ được tổ chức thành cây.
  2. Khi tìm kiếm: PostgreSQL dùng chỉ mục để tìm dòng cần thiết nhanh, thay vì phải quét hết bảng.
  3. Cấu trúc cây: cây được sắp xếp, cho phép nhảy nhanh từ dòng này sang dòng khác (kiểu binary search).

Ví dụ: giả sử có bảng 1 triệu dòng. Không có chỉ mục thì phải kiểm tra hết 1 triệu dòng. Có chỉ mục thì PostgreSQL chỉ cần kiểm tra vài chục dòng thôi.

Khi nào nên dùng chỉ mục?

Chỉ mục tăng tốc đáng kể cho các thao tác đọc, ví dụ: tìm kiếm, lọc, sắp xếp. Nhưng bù lại, nó làm chậm thao tác ghi (như INSERT, UPDATE, DELETE), vì mỗi lần thay đổi dữ liệu thì chỉ mục cũng phải cập nhật.

Trường hợp nên dùng chỉ mục

Truy vấn tìm kiếm thường xuyên: Khi bạn hay tìm dòng theo giá trị cụ thể, ví dụ:

SELECT * FROM employees WHERE last_name = 'Мин';

Lọc dữ liệu: Khi bạn dùng điều kiện trong WHERE hoặc HAVING:

SELECT * FROM employees WHERE salary > 50000;

Sắp xếp dữ liệu: Khi dùng ORDER BY:

SELECT * FROM employees ORDER BY hire_date DESC;

Kết nối bảng (JOIN): Nếu bạn hay join bảng dựa trên các cột cụ thể.

*Khi nào *KHÔNG nên dùng chỉ mục

  • Nếu bảng rất nhỏ (kiểu 10-50 dòng), chỉ mục không giúp tăng tốc rõ rệt đâu.
  • Nếu cột bạn định tạo chỉ mục hiếm khi được dùng trong truy vấn.
  • Nếu dữ liệu trong cột đó có rất ít giá trị khác nhau (ví dụ trường gender chỉ có 2-3 giá trị).

Ví dụ: tạo chỉ mục trên trường status chỉ có hai giá trị — "активный" và "неактивный" — thì không hợp lý lắm.

Ảnh hưởng của chỉ mục đến hiệu suất

Như bạn thấy, chỉ mục giúp tăng tốc truy vấn đọc, nhưng có thể làm chậm thao tác ghi. Lý do là khi thêm, cập nhật hoặc xóa dòng thì PostgreSQL phải cập nhật thông tin trong chỉ mục nữa.

Cân bằng giữa dùng chỉ mục và hiệu suất

  • Với bảng hay thay đổi dữ liệu, nên cẩn thận với số lượng chỉ mục.
  • Với bảng chủ yếu dùng để đọc dữ liệu, chỉ mục là bắt buộc luôn.

Lợi ích của chỉ mục ngoài đời thực

Thực tế, chỉ mục được dùng rộng rãi để:

  1. Tối ưu hóa web app: tăng tốc load trang nhờ truy vấn SQL nhanh hơn.
  2. Làm việc với bảng lớn: không có chỉ mục, truy vấn bảng hàng triệu dòng có thể mất cả phút.
  3. Khả năng mở rộng: chỉ mục giúp xử lý lượng dữ liệu lớn hiệu quả.

Ví dụ, một shop online với database sản phẩm và đơn hàng mà không có chỉ mục thì khách hàng chắc phải đợi load trang đến năm sau luôn á.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION