Tìm hiểu về B-Tree indexes và Hash indexes trong MySQL

Khi tạo Index cho một bảng ta sử dụng lệnh:

_CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
USING [BTREE | HASH | RTREE]
ON table_name (column_name [(length)] [ASC | DESC],...);_

BTREE hoặc HASH hoặc RTREE là các kiểu Index, hiểu rõ về chúng sẽ giúp chúng ta tạo ra các index hiệu quả hơn. Người viết chỉ so sánh 2 loại index phổ dụng nhất trong MySql là BTREE và HASH.

  1. Những đặc điểm của BTREE index:

    • Dữ liệu index được tổ chức và lưu trữ theo dạng tree, tức là có root, branch, leaf. Giá trị của các node được tổ chức tăng dần từ trái qua phải.
    • Btree index được sử dụng trong các biểu thức so sánh dạng: =, >, >=, <, <=, BETWEEN, LIKE.
    • Khi truy vấn dữ liệu thì việc tìm kiếm trong BTREE là 1 quá trình đệ quy, bắt đầu từ root node và tìm kiếm tới branch và leaf, đến khi tìm được tất cả dữ liệu thỏa mãn với điều kiện truy vấn thì mới dùng lại.
    • Btree index được sử dụng cho những column trong bảng khi muốn tìm kiếm 1 giá trị nằm trong khoảng nào đó. Ví dụ: tìm kiếm những sinh viên có điểm Toán từ 5-9
  2. Những đặc điểm của HASH index:

  • Hash index có một vài đặc điểm khác biệt so với Btree index.
  • Dữ liệu index được tổ chức theo dạng Key - Value được liên kết với nhau.
  • Khác với BTREE, thì HASH index chỉ nên sử dụng trong các biểu thức toán tử là = và <>. Không sử dụng cho toán từ tìm kiếm 1 khoảng giá trị như > hay < .
  • Không thể tối ưu hóa toán tử ORDER BY bằng việc sử dụng HASH index bởi vì nó không thể tìm kiếm được phần từ tiếp theo trong Order.
  • Toàn bộ nội dung của Key được sử dụng để tìm kiếm giá trị records, khác với BTREE một phần của node cũng có thể được sử dụng để tìm kiếm.
  • Hash có tốc độ nhanh hơn kiểu Btree.

Việc chọn index theo kiểu BTREE hay HASH ngoài yếu tố về mục đích sử dụng index thì nó còn phụ thuộc vào mức độ hỗ trợ của Storage Engine. Ví dụ MyISAM, InnoDB hay Archive chỉ hỗ trợ Btree, trong khi Memory lại hỗ trợ cho cả 2.