it-swarm-vi.tech

Chỉ số được bảo hiểm là gì?

Tôi vừa nghe thuật ngữ chỉ mục được bảo hiểm trong một số cuộc thảo luận về cơ sở dữ liệu - nó có nghĩa là gì?

65
Martynnw

Chỉ số bao phủ là chỉ mục chứa tất cả và có thể nhiều hơn các cột bạn cần cho truy vấn của mình.

Ví dụ:

SELECT *
FROM tablename
WHERE criteria

thông thường sẽ sử dụng các chỉ mục để tăng tốc độ phân giải của các hàng cần lấy bằng tiêu chí , nhưng sau đó nó sẽ chuyển đến bảng đầy đủ để truy xuất các hàng.

Tuy nhiên, nếu chỉ mục chứa các cột cột1, cột2 cột3 , sau đó sql này:

SELECT column1, column2
FROM tablename
WHERE criteria

và, với điều kiện là chỉ mục cụ thể có thể được sử dụng để tăng tốc độ phân giải của các hàng cần lấy, chỉ mục đã chứa các giá trị của các cột mà bạn quan tâm, do đó, nó sẽ không phải đi đến bảng để truy xuất các hàng , nhưng có thể tạo ra kết quả trực tiếp từ chỉ số.

Điều này cũng có thể được sử dụng nếu bạn thấy rằng một truy vấn thông thường sử dụng 1-2 cột để giải quyết các hàng nào và sau đó thường thêm 1-2 cột khác, có thể có ích khi nối thêm các cột đó (nếu chúng giống nhau trên tất cả ) vào chỉ mục, để bộ xử lý truy vấn có thể nhận mọi thứ từ chính chỉ mục.

Đây là một bài viết: Chỉ số bao trùm tăng hiệu năng truy vấn máy chủ SQL về chủ đề.

54

Chỉ số bao phủ chỉ là một chỉ số bình thường. Nó được gọi là "bao phủ" nếu nó có thể đáp ứng truy vấn mà không cần thiết phải phân tích dữ liệu.

thí dụ:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

Đây là một trong những phương pháp nhanh nhất để lấy dữ liệu từ máy chủ SQL.

13
aku

Hãy nói rằng bạn có một bảng đơn giản với các cột bên dưới, bạn chỉ có Id được lập chỉ mục ở đây:

Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)

Hãy tưởng tượng bạn phải chạy truy vấn bên dưới và kiểm tra xem nó có sử dụng chỉ mục hay không và liệu có thực hiện hiệu quả mà không có cuộc gọi I/O hay không. Hãy nhớ rằng, bạn chỉ tạo một chỉ mục trên Id.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Khi bạn kiểm tra hiệu suất của truy vấn này, bạn sẽ thất vọng, vì Telephone_Number không được lập chỉ mục này cần tìm nạp các hàng từ bảng bằng các cuộc gọi I/O. Vì vậy, đây không phải là một bao phủ được lập chỉ mục vì có một số cột trong truy vấn không được lập chỉ mục, dẫn đến các cuộc gọi I/O thường xuyên.

Để biến nó thành một chỉ mục được bảo hiểm, bạn cần tạo một chỉ mục tổng hợp trên (Id, Telephone_Number).

Để biết thêm chi tiết, vui lòng tham khảo blog này: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/

2
JumpMan

Các chỉ mục bao trùm là các chỉ mục "bao trùm" tất cả các cột cần thiết từ một bảng cụ thể, loại bỏ tất cả nhu cầu truy cập vào bảng vật lý cho một truy vấn/thao tác đã cho.

Vì chỉ mục chứa các cột mong muốn (hoặc siêu bộ của chúng), truy cập bảng có thể được thay thế bằng tra cứu hoặc quét chỉ mục - thường nhanh hơn nhiều.

Cột để che:

  • điều kiện tham số hóa hoặc tĩnh; cột bị hạn chế bởi một điều kiện tham số hoặc không đổi.
  • tham gia cột; cột được sử dụng động để tham gia
  • các cột được chọn; để trả lời các giá trị được chọn.

Mặc dù các chỉ số bao phủ thường có thể mang lại lợi ích tốt cho việc truy xuất, nhưng chúng có thêm phần nào để chèn/cập nhật chi phí; do nhu cầu viết các hàng chỉ mục thêm hoặc lớn hơn trên mỗi bản cập nhật.

Bao gồm các chỉ mục cho các truy vấn đã tham gia

Các chỉ mục bao trùm có lẽ có giá trị nhất như là một kỹ thuật hiệu suất cho các truy vấn đã tham gia. Điều này là do các truy vấn đã tham gia có chi phí cao hơn và nhiều khả năng truy xuất bảng đơn phải chịu các vấn đề về hiệu suất chi phí cao.

  • trong một truy vấn đã tham gia, các chỉ mục bao gồm phải được xem xét trên mỗi bảng.
  • mỗi 'chỉ số che phủ' sẽ loại bỏ quyền truy cập bảng vật lý khỏi gói và thay thế nó bằng quyền truy cập chỉ mục.
  • điều tra chi phí kế hoạch & thử nghiệm xem bảng nào đáng giá nhất để thay thế bằng chỉ số bao phủ.
  • bằng cách này, chi phí nhân của các kế hoạch tham gia lớn có thể giảm đáng kể.

Ví dụ:

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

Xem:

2
Thomas W