Chỉ mục B-cây tương tự như chỉ mục B+-cây. Sự khác biệt là ở chỗ B-cây loại bỏ lưu trữ dư thừa các giá trị khoá tìm kiếm. Trong B-cây, các giá trị khoá chỉ xuất hiện một lần. Do các khoá tìm kiếm xuất hiện trong các nút không là lá không xuất hiện ở bất kỳ nơi nào khác nữa trong B-cây, ta phải thêm một trường con trỏ cho mỗi khoá tìm kiếm trong các nút không là lá. Con trỏ thêm vào này trỏ tới hoặc mẩu tin trong file hoặc bucket tương ứng.
Một nút lá B-cây tổng quát có dạng:
P1 K1 P2 K2 ... Pm-1 Km-1 Một nút không là lá có dạng: Pm P1 K1 P2 B2 K2 P 1 B B1 B m- 1 K 1 P
Các con trỏ Pi là các con trỏ cây và được dùng như trong B+-cây. Các con trỏ Bi trong các nút không là lá là các con trỏ mẩu tin hoặc con trỏ bucket. Rõ ràng là số giá trị khoá trong nút không lá nhỏ hơn số giá trị trong nút lá. Số nút được truy xuất trong quá trình tìm kiếm trong một B-cây phụ thuộc nơi khoá tìm kiếm được định vị.
Xoá trong một B-cây phức tạp hơn trong một B+-cây. Xoá một đầu vào xuất hiện ở một nút không là lá kéo theo việc tuyển chọn một giá trị thích hợp trong cây con của nút chứa đầu vào bị xoá. Nếu khoá Ki bị xoá, khoá nhỏ nhất trong cây con được trỏ bởi Pi+1 phải được di chuyển vào vị trí của Ki. Nếu nút lá còn lại quá ít đầu vào, cần thiết các hoạt động bổ xung.
III.9.4 Định nghĩa chỉ mục trong SQL
Một chỉ mục được tạo ra bởi lệnh CREATE INDEX với cú pháp
CREATE INDEX < index-name > ON < relation_name > (< attribute-list >)
attribute-list là danh sách các thuộc tính của quan hệđược dùng làm khoá tìm kiếm cho chỉ mục. Nếu muốn
khai báo là khoá tìm kiếm là khoá dự tuyển, thêm vào từ khoá UNIQUE:
CREATE UNIQUE INDEX < index-name > ON < relation_name > (< attribute-list >)
attribute-list phải tạo thành một khoá dự tuyển, nếu không sẽ có một thông báo lỗi.
Bỏđi một chỉ mục sử dụng lệnh DROP: DROP INDEX < index-name >