Index là 1 database object được tạo ra trên table với mục đích tăng tốc độ truy xuất dữ liệu. Với ý nghĩa tương tự mục lục của 1 cuốn sách (khi cần tìm 1 chương, ta chỉ cần dò mục lục và có thể mở ngay đến trang ta cần), index được tạo trên 1 hoặc nhiều column. Khi đó index sẽ lưu giữ các giá trị trong các column đó, cùng với ROWID (địa chỉ vật lý trên disk) của từng row dữ liệu. Nhờ vậy, khi query 1 lượng data nhỏ, Oracle có thể lấy được ngay dữ liệu nhờ vào việc truy xuất ngay đến đúng vị trí row dữ liệu trên disk, thay vì phải dò toàn bộ table để tìm dữ liệu.

 

Tuy nhiên, index cũng tốn disk để lưu trữ, tốn CPU, I/O khi tạo hay cập nhật lại index. Nếu tạo quá nhiều index trên 1 table có thể gây chậm trễ thao tác DML khi phải cập nhật lại quá nhiều index. 

 

Do đó, ta cần nắm được lý thuyết về index để sử dụng cho chính xác và hiệu quả.

 

Một số đặc điểm của index

  • Là 1 đối tượng trong database, được định nghĩa trên table column
  • Lưu trữ riêng rẽ với table, có thể tạo hay xóa mà không ảnh hưởng tới table
  • Khi table bị drop thì index cũng bị drop theo
  • Có nhiều loại index khác nhau
  • Mục đích lớn nhất là hỗ trợ tăng performance khi truy vấn

VD: 1 câu truy vấn có sử dụng index

 

 

Các loại index

Về cơ bản, chúng ta sẽ có B-tree index, bitmap index & 1 số loại index đặc biệt

 

B-tree index

– Là loại index mặc định trong Oracle database

– Dựa trên nguyên lý cây cân bằng (balanced tree)

– Dữ liệu trong column càng phân biệt (high cardinality) thì index càng tốt

– Phù hợp trong hầu hết các trường hợp, nhất là trên OLTP database

 

Ví dụ minh họa B-tree index

 

btreeindex_sample

 

Các biến thể của B-tree index

  • Index-organized table (IOT): thay vì chỉ lưu rowid + column được index, Oracle lưu toàn bộ giá trị các column vào index
  • Unique index: đảm bảo không có giá trị nào trùng lặp, dùng cho primary key & unique key constraint
  • Reverse key index: giảm tải I/O trong trường hợp table được insert dữ liệu quá nhiều
  • Key compressed index: nén index trong trường hợp tạo index trên nhiều column (concatenated index), và column đứng đầu thường có các giá trị lặp lại
  • Descending index: B-tree index được xếp theo thứ tự tăng dần (ví dụ index trên column STT thì số nhỏ nhất sẽ là node leaf ngoài cùng bên trái). Descending index đảo ngược thứ tự lại.

Bitmap index

– Sử dụng các bit arrays để lưu trữ index

– Dữ liệu trong column càng ít phân biệt (low cardinality) thì index càng tốt

– Phù hợp hơn trên môi trường data warehouse

 

VD: tạo bitmap index trên column giới tính (gồm 2 giá trị Male, Female)

 

bitmapindex_sample

 

Các loại index đặc biệt

  • Bitmap join index: lưu trữ kết quả join 2 table
  • Function-based index: index 1 column nằm trong hàm hay biểu thức tính toán
  • Indexed virtual column: tạo index trên virtual column
  • Virtual index: tạo index ảo, dùng để kiểm tra xem có sử dụng được không trước khi tạo thật
  • Invisible index: ẩn index đi, dùng để kiểm tra xem index có được sử dụng không trước khi xóa
  • Global partitioned index: index được partition không phụ thuộc vào table
  • Local partitioned index: index được partition phụ thuộc vào table partition
  • Domain index: dùng trên các loại dữ liệu đặc biệt
  • B-tree cluster, Hash cluster index: dùng trên cluster table

 

Nên tạo index trên column nào

  • Column làm khóa chính (index sẽ được tạo tự động)
  • Unique column (index sẽ được tạo tự động)
  • Column làm khóa ngoại
  • Các column hay được dùng trong mệnh đề WHERE
 …

Trong các phần sau chúng ta sẽ tìm hiểu chi tiết hơn về từng loại index.