3. Mơ hình dữ liệu Cassandra
3.8 Chỉ mục trong Cassandra
Một chỉ mục là một cấu trúc dữ liệu cho phép tìm kiếm dữ liệu nhanh, hiệu quả phù hợp với một điều kiện đã cho.
3.8.1 Chỉ mục chính
Trong thiết kế cơ sở dữ liệu quan hệ, một khóa chính là khóa duy nhất được dùng
để xác định mỗi dòng trong bảng. Một chỉ mục khóa chính, giống như chỉ mục, tăng tốc độ truy nhập ngẫu nhiên tới dữ liệu trong bảng. Khóa chính cũng đảm bảo tính duy nhất
của bản ghi, và có thể điều khiển thứ tự trong đó các bản ghi được phân cụm một cách vật lý, hoặc được lưu trữ trong cơ sở dữ liệu.
Trong Cassandra, chỉ mục chính cho một column family là chỉ mục của các khóa dịng. Mỗi node giữ chỉ mục này cho dữ liệu nó quản lý.
Các dịng được gán cho các node bởi phân vùng cluster được cấu hình, và chiến lược đặt bản sao keyspace đã cấu hình. Chỉ mục chính trong Cassandra cho phép tìm kiếm
các dịng theo khóa dịng. Vì mỗi node biết khoảng các khóa mà nó quản lý, các dịng
được yêu cầu có thể được định vị một cách hiệu quả bằng việc quét các chỉ mục dòng chỉ
trên các bản sao liên quan.
Với các khóa dịng được phân vùng ngẫu nhiên (mặc định trong Cassandra), các
khóa dịngđược phân vùng bởi mã băm MD5 và không được quét theo thứ tự như trong
các chỉ mục cây nhị phân truyền thống. Sử dụng các phân vùng có thứ tự cho phép giới hạn các truy vấn tới các dòng, nhưng khơng được khuyến khích vì độ phức tạp trong việc
3.8.2 Chỉ mục thứcấp
Các chỉ mục thứ cấp trong Cassandra chỉ các chỉ mục trên giá trị cột (để phân biệt với chỉ mục khóa dịng chính cho một column family). Cassandra hỗ trợ các chỉ mục thứ cấp của kiểu KEYS (tương tự như chỉ mục băm).
Các chỉ mục thứ cấp cho phép truy vấn hiệu quả bởi việc chỉ ra các giá trị bằng phép bằng (where column x = value y). Và, các truy vấn trên các giá trị đãđược đánh chỉ
mục có thể áp dụng các bộ lọc bổ sung vào tập kết quả cho các giá trị ở cột khác.
Chỉ mục thứ cấp của Cassandra tốt nhất cho các trường hợp nhiều dịng chứa giá trị
được đánh chỉ mục.
Ví dụ, giả sử bạn có mọt bảng user với hàng tỉ người dùng, và muốn tìm kiếm
người dùng theo bang mà họ sống. Rất nhiều người dùng sẽ có cùng giá trị cột cho bang
(như CA, NY, TX…). Đây là ứng cử viên tốt nhất cho chỉ mục thứ cấp. Mặc khác, nếu
bạn muốn tìm kiếm người dùng theo địa chỉ email của họ (một giá trị thường là duy nhất cho mỗi người), thì có thể hiệu quả hơn khi duy trì một cách thủ công column family
động dưới dạng một “chỉ mục”.
Thậm chí với các cột chứa dữ liệu độc nhất, sử dụng các chỉ mục thứ cấp cũng là một điều khôn ngoan, chừng nào khối lượng truy vấn tới các column family được đánh chỉ mục là vừa phải và không dưới một tải liên tục.
Một ưu điểm khác của các chỉ mục thứ cấp là sự dễ dàng về mặt thao tác duy trì chỉ mục. Khi bạn tạo một chỉ mục thứ cấp cho một cột, nó đánh chỉ mục dữ liệu ngầm bên
dưới.
Các column family được client duy trì như những chỉ mục phải được tạo một cách thủ cơng; ví dụ, nếu cột bang được đánh chỉ mục bằng cách tạp ra một column family như users_by_state , ứng dụng client phải xây dựng column family với dữ liệu từ column
family users.
3.8.3 Tạo và sửdụng chỉ mục thứcấp
Bạn có thể chỉ ra kiểu KEYS khi tạo ra định nghĩa cột, hoặc bạn có thể thêm vào
sau để đánh chỉ mục một cột có sẵn. Các chỉ mục thứ cấp được tạo một cách tự động bởi
tiến trình nền mà khơng cần phải khóa các thao tác đọc, ghi.
Ví dụ, trong Cassandra CLI, bạn có thể tạo ra một chỉmục thứ cấp trên một côt khi
định nghĩa column family (chú ý index_type: đặc tả KEYS cho các cột state và
[default@demo] create column family users with comparator=UTF8Type
... and column_metadata=[{column_name: full_name, validation_class: UTF8Type}, ... {column_name: email, validation_class: UTF8Type},
... {column_name: birth_year, validation_class: LongType, index_type: KEYS}, ... {column_name: state, validation_class: UTF8Type, index_type: KEYS}]; Hoặc bạn có thể thêm một chỉ mục vào column family đã có:
[default@demo] update column family users with comparator=UTF8Type
... and column_metadata=[{column_name: full_name, validation_class: UTF8Type}, ... {column_name: email, validation_class: UTF8Type},
... {column_name: birth_year, validation_class: LongType, index_type: KEYS}, ... {column_name: state, validation_class: UTF8Type, index_type: KEYS}];
Vì chỉ mục thứ cấp được tạo cho cột state, giá trị của nó có thể được truy vấn trực tiếp với những người dùng sống ở một bang nào đó, như
[default@demo] get users where state = 'TX';