Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Tối ưu hóa cơ sở dữ liệu:Chỉ mục

Tôi nhận thấy rằng rất ít người hiểu cách các chỉ mục hoạt động trong SQL Server, đặc biệt là các Cột bao gồm. Tuy nhiên, chỉ mục là cách tuyệt vời để tối ưu hóa các truy vấn. Lúc đầu, tôi cũng không hiểu về các cột được bao gồm, nhưng các thử nghiệm của tôi cho thấy chúng rất hữu ích.

Giả sử, chúng ta có bảng và truy vấn sau:

CREATE TABLE Person (
 PersonID int,
 FirstName varchar(100),
 LastName varchar(100),
 Age int,
 …
 …
)

SELECT FirstName, LastName, Age
FROM Person
WHERE FirstName = 'John' and LastName = 'Smith'

Rõ ràng rằng PersonID là một khóa chính. Giả sử chúng ta có một chỉ mục theo họ và tên, hãy gọi nó là IX_Person_FirstNameLastName. Kế hoạch thực thi cho một truy vấn như vậy sẽ như sau:

  1. Định vị tất cả các dòng có họ và tên được chỉ định với sự trợ giúp của cây chỉ mục IX_Person_FirstNameLastName
  2. Việc phát hiện vị trí thực của dòng trên đĩa trên chỉ mục, chuyển đến vị trí thực và đọc độ tuổi.

Bây giờ, hãy xem xét rằng truy vấn này được thực thi khá thường xuyên. Chúng ta phải thực hiện 2 bước mỗi lần. Nó có thể được tối ưu hóa không? Trong trường hợp MS SQL Server, đó không phải là vấn đề - bạn có thể bao gồm các giá trị ngay trong chỉ mục với sự trợ giúp của tùy chọn INCLUDE.

CREATE INDEX IX_PERSON ON Person
( 
 FirstName,
 LastName
) 
INCLUDE(Age)

Bây giờ, trường này không được sử dụng trong quá trình lập chỉ mục nhưng được đưa vào chỉ mục. Chúng ta có thể phải đối mặt với những rắc rối nào trong vấn đề này? Khi chúng tôi lập chỉ mục một bảng theo một trường nhất định, máy chủ cơ sở dữ liệu phải xây dựng cây chỉ mục theo trường này. Điều này có nghĩa là chúng ta cần thay đổi cây chỉ mục khi thay đổi giá trị. Khi các giá trị được sửa đổi nhiều, nó sẽ trở thành một nhiệm vụ khó khăn và khó khăn đối với máy chủ. Khi việc cập nhật trở nên quá ồ ạt, đôi khi dễ bị tụt chỉ số hơn. Chỉ mục tối ưu hóa đáng kể việc tìm kiếm nhưng ảnh hưởng tiêu cực đến các hoạt động chèn, xóa và cập nhật.
Nếu một trường chỉ được đưa vào một chỉ mục, thì trường đó không được sử dụng trong quá trình xây dựng cây chỉ mục và không ảnh hưởng đến nó, nhưng có thể dễ dàng tìm thấy giá trị trên lá của cây này. Khi tìm kiếm theo họ và tên diễn ra, máy chủ sẽ tìm kiếm tất cả họ và tên từ cây và khi nó đến lá (tìm giá trị chỉ mục cần thiết), thì ngoài con trỏ đến vị trí thực của giá trị dòng, nó cũng chứa các giá trị trường có trong chỉ mục. Có nghĩa là không cần thực hiện bước thứ hai để chuyển sang vị trí thực của đường và đọc từ đó.

Vì bạn không cần phải thay đổi cây khi sửa đổi dữ liệu độ tuổi, nên tất cả những thứ này không ảnh hưởng nhiều đến hoạt động sửa đổi dữ liệu. Chúng ta không cần thay đổi chỉ mục, chúng ta chỉ cần thay đổi các giá trị trên lá cây. Đó là lý do tại sao ngay cả một sự thay đổi lớn của trường Tuổi cũng không có tác động lớn đến hiệu suất. Nó chắc chắn sẽ ảnh hưởng, nhưng không quá nhiều.

Theo như tôi biết, các giá trị của chỉ mục nhóm được tự động đưa vào cấp độ lá, nhưng điều này phải được kiểm tra với đặc điểm kỹ thuật.

Vì vậy, khi sử dụng các trường bao gồm có lợi? Khi chúng thường xuyên được sử dụng trong kết quả truy vấn nhưng thỉnh thoảng lại bị thay đổi. Một ví dụ là một bảng các giao dịch ngân hàng. Bảng này có thể bao gồm các trường sau:số tài khoản, loại giao dịch, ngày tháng, tổng. Việc lập chỉ mục theo tổng không có ích lợi gì, nhưng chúng tôi có thể đưa nó vào chỉ mục và nó sẽ tăng tốc đáng kể cho truy vấn.

Để truy xuất hiệu ứng thực sự từ việc lập chỉ mục, các truy vấn không nên chọn tất cả các trường, tức là chúng ta nên quên bảng SELECT * FROM. Luôn chỉ tính toán lại các trường bạn thực sự cần. Và nếu giá trị của chúng nằm trong chỉ mục, tốc độ thực thi có thể khá cao.

Công cụ hữu ích:

dbForge Index Manager - phần bổ trợ SSMS tiện dụng để phân tích trạng thái của chỉ mục SQL và khắc phục sự cố với phân mảnh chỉ mục.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng INNER JOIN trong SQL

  2. Mô hình cơ sở dữ liệu cơ sở trong thực tế:Thử thách của Blogger

  3. Cách tạo bản sao giao dịch

  4. Tách chuỗi đúng cách - hoặc cách tốt nhất tiếp theo

  5. So sánh bốn công cụ IDE cơ sở dữ liệu hàng đầu