INDEX trong SQL: Tổng quan, khái niệm, cơ chế hoạt động

Chào các bạn, INDEX trong SQL là một khái niệm mà mình nghĩ rằng bất cứ lập trình viên nào cũng đã phải từng nghe qua. Có thể bạn chưa hiểu rõ INDEX là gì nhưng ít nhất bạn cũng phải từng loáng thoáng nghe nói về tác dụng giúp truy vấn dữ liệu nhanh hơn đúng không nào. Mình biết khái niệm này cũng lâu rồi, tuy vậy lại chưa tìm hiểu kỹ càng nhiều về nó. Hôm nay, nhân một ngày rảnh dỗi mình quyết tâm vác sách vác bút (chém tí chứ thực ra là vác phím) đi tìm hiểu cho thấu rõ huyền cơ về nó. Bài viết này mình viết ra với mục đích là tổng hợp lại những thông tin tổng quan mà mình biết/tìm hiểu về INDEX nhé.

INDEX trong SQL là gì?

Nói dễ hiểu thì bạn hay tưởng tượng bạn có một quyển bách khoa toàn thư chứa thông tin về mọi thứ trên đời. Một ngày đẹp trời nào đó bạn bị “say nắng” ai đó và muốn tìm hiểu về cách tán gán/trai. Bạn sẽ làm thế nào nếu không có mục lục. Tất nhiên là bạn sẽ phải tìm qua từng trang một đến khi nào tìm được toàn bộ những thông tin về “bí kíp tán gái/trai” đúng không? Còn nếu có mục lục thì mọi thứ sẽ dễ dàng hơn. Chỉ cần dở mục lục ra là bạn sẽ tìm và đọc được ngay bí kíp rồi. Nhưng để mà tạo ra mục lục cho quyển sách khổng lồ này thì người viết cũng cần mất nhiều công sức hơn và chúng ta cũng cần tốn nhiều trang giấy để viết mục lục lên đó.

Ở đây mình muốn nói rằng là:

  • “cách tán gán/trai” -> từ khóa cần truy vấn
  • Quyển sách -> Database
  • Mục lục -> INDEX
  • Người viết sách -> Công cụ ghi
  • Bạn -> Công cụ truy vấn

Đấy là cách giải thích kiểu “amateur”, còn sau đây là giải thích theo kiểu “professional” nhé:

Theo VietJack thì:

Chỉ mục (Index) là bảng tra cứu đặc biệt mà Database Search Engine có thể sử dụng để tăng nhanh thời gian và hiệu suất thu thập dữ liệu. Hiểu đơn giản, một chỉ mục là một con trỏ tới dữ liệu trong một bảng.
Một chỉ mục giúp tăng tốc các truy vấn SELECT và các mệnh đề WHERE, nhưng nó làm chậm việc dữ liệu nhập vào, với các lệnh UPDATE và INSERT. Các chỉ mục có thể được tạo hoặc xóa mà không ảnh hưởng tới dữ liệu.

Cơ chế hoạt động

Khi bạn thực hiện truy vấn đến cơ sở dữ liệu. Database Engine sẽ thực hiện việc quét qua toàn bộ tất cả các bản ghi trong bảng đến tìm những bản ghi phù hợp với điều kiện. Những bảng có ít dữ liệu và dữ liệu không phức tạp thì ổn. Tuy nhiên nếu dữ liệu lớn và phức tạp thì việc quét này sẽ rất chậm và tốn rất nhiều tài nguyên của hệ thống.

Khi bạn đánh chỉ mục cho bảng. Database Engine sẽ tìm đến chỗ lưu chỉ mục để có thể so sánh và lấy ra vị trí chính xác của hàng dữ liệu phù hợp với điều kiện truy vấn. Qua đó việc đánh INDEX sẽ giúp việc truy vấn dữ liệu trở lên nhanh hơn và tốn ít tài nguyên hơn so với việc quét toàn bộ bản ghi trong bảng.

Các loại INDEX trong SQL

Trong SQL có 2 loại INDEX đó là:

  1. Clustered Index
    • Đây là dạng INDEX mà dữ liệu của bảng sẽ được sắp xếp một cách vật lý theo thứ tự. Chính vì vậy mà trong một bảng chỉ có duy nhất một Clustered Index.
    • Dạng Index này sẽ lưu trực tiếp vào trong bảng theo trường được đánh INDEX.
    • Thường được tạo ra khi bảng có Primary Key. Nếu không có Primary Key, nó sẽ được tạo khi một trường được định nghĩa là UNIQUE (nếu chưa tồn tại Clustered Index trước đó).
  2. Non-clustered Index
    • Một non-clustered index sẽ được lưu ra một nơi hoàn toàn tách biệt so với bảng cơ sở.
    • Nó sẽ không sắp xếp dữ liệu khi lưu.
    • Một non-clustered index sẽ chứa giá trị của chỉ mục cùng với một con trỏ trực tiếp đến vị trí của hàng dữ liệu trong bảng.

Bạn có thể xem thêm bài viết INDEX trong SQL: Cách tạo/xóa và lưu ý với các truy vấn có INDEX.

Tham khảo: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017

Nguồn: vantien.net