Tôi không biết về nội bộ của Microsoft SQL Server, nhưng tôi có thể trả lời cho MySQL mà bạn đã gắn thẻ cho câu hỏi của mình. Các chi tiết có thể thay đổi đối với các triển khai khác.
Q1. Đúng vậy, không cần thêm dung lượng cho chỉ mục được phân nhóm.
Điều gì xảy ra nếu bạn giảm chỉ mục theo nhóm? Công cụ InnoDB của MySQL luôn sử dụng khóa chính (hoặc khóa duy nhất không null đầu tiên) làm chỉ mục nhóm. Nếu bạn xác định bảng không có khóa chính hoặc bạn bỏ khóa chính của bảng hiện có, InnoDB tạo khóa nhân tạo nội bộ cho chỉ mục được nhóm . Khóa nội bộ này không có cột logic để tham chiếu đến nó.
Quý 2. Thứ tự các hàng được trả về bởi truy vấn sử dụng chỉ mục không phân cụm không được đảm bảo. Trong thực tế, đó là thứ tự mà các hàng được truy cập. Nếu bạn cần các hàng được trả lại theo một thứ tự cụ thể, bạn nên sử dụng ORDER BY
trong truy vấn của bạn. Nếu trình tối ưu hóa có thể suy ra rằng thứ tự mong muốn của bạn giống với thứ tự mà nó sẽ truy cập vào các hàng (thứ tự lập chỉ mục, cho dù theo chỉ mục được nhóm hay không theo nhóm), thì nó có thể bỏ qua bước sắp xếp.
Q3. Chỉ mục không phân cụm InnoDB không có con trỏ đến hàng tương ứng tại một lá của chỉ mục, nó có giá trị giá trị của khóa chính. Vì vậy, tra cứu trong chỉ mục không phân cụm thực sự là hai tìm kiếm cây B, tìm kiếm đầu tiên để tìm lá của chỉ mục không phân cụm và sau đó là tìm kiếm thứ hai trong chỉ mục được phân nhóm.
Chi phí này cao gấp đôi so với một lần tìm kiếm cây B đơn lẻ (nhiều hơn hoặc ít hơn), vì vậy, InnoDB có một tính năng bổ sung được gọi là Chỉ mục băm thích ứng . Các giá trị được tìm kiếm thường xuyên được lưu vào bộ nhớ cache trong AHI và lần tiếp theo khi truy vấn tìm kiếm giá trị được lưu trong bộ nhớ cache, nó có thể thực hiện tra cứu O (1). Trong bộ đệm ẩn AHI, nó tìm thấy một con trỏ trực tiếp đến lá của chỉ mục nhóm, vì vậy nó loại bỏ cả hai Tìm kiếm B-tree, một phần thời gian.
Điều này cải thiện tổng hiệu suất bao nhiêu tùy thuộc vào tần suất bạn tìm kiếm (các) giá trị tương tự đã được tìm kiếm trước đó. Theo kinh nghiệm của tôi, tỷ lệ giữa tìm kiếm băm so với tìm kiếm không băm là khoảng 1:2.
Q4. Xây dựng các chỉ mục để phục vụ các truy vấn bạn cần được tối ưu hóa. Thông thường, một chỉ mục được phân nhóm là một khóa chính hoặc khóa duy nhất, và ít nhất trong trường hợp của InnoDB, điều này là bắt buộc. Cả age
cũng không phải salary
có khả năng là duy nhất.
Bạn có thể thích bản trình bày của tôi, Cách thiết kế chỉ mục, Thực sự .
Q5. InnoDB tự động tạo chỉ mục khi bạn khai báo một ràng buộc duy nhất. Bạn không thể có ràng buộc mà không có chỉ mục tồn tại cho nó. Nếu bạn không có chỉ mục, làm cách nào để công cụ đảm bảo tính duy nhất khi bạn chèn một giá trị? Nó sẽ cần phải tìm kiếm toàn bộ bảng để tìm một giá trị trùng lặp trong cột đó. Chỉ mục giúp thực hiện các kiểm tra duy nhất hiệu quả hơn nhiều.