Lập chỉ mục cơ sở dữ liệu


12

Tôi không quá quen thuộc với cơ sở dữ liệu và bây giờ tôi đang cố gắng hiểu cơ chế lập chỉ mục.

Từ những gì tôi biết, trong RDBMS, lập chỉ mục trên một cột làm cho việc tìm kiếm theo cột đó nhanh hơn. Điều này cũng đúng với ba cửa hàng, chỉ có các chỉ số cho rằng bạn sẽ tìm kiếm (ví dụ) chủ yếu theo chủ đề, sau đó theo đối tượng, v.v.

Tôi không chắc chắn về RDBMS, nhưng trên ba cửa hàng, bạn có thể xác định nhiều hơn một chỉ mục, cho phép cửa hàng chọn chỉ mục tốt nhất cho mỗi truy vấn (hy vọng tôi hiểu đúng về điều này). Đương nhiên, câu hỏi sau đây xuất hiện:

Tại sao tôi không nên thêm tất cả các chỉ mục có thể vào một cửa hàng ba và mở rộng sang RDBMS, tại sao không tạo các chỉ mục trên mỗi cột (giả sử tôi không quá lười biếng)?

Câu trả lời:


25

Bởi vì, về cơ bản, một chỉ mục là một bảng phụ, trong đó khóa chính là trường bạn đang lập chỉ mục và nội dung duy nhất là khóa chính của bảng chính của bạn. Vì vậy, mọi cập nhật phải được nhân rộng trong mọi chỉ mục sử dụng trường bạn cập nhật.

Điều này đặc biệt đáng chú ý trên Phụ trang. Hãy tưởng tượng nếu mỗi lần chèn bạn thực hiện vào một bảng phải được sao chép trên 20 bảng khác. Nó sẽ bị chậm một cách đau đớn.

Lưu ý rằng điều này thậm chí còn tồi tệ hơn với các chỉ mục ghép, cụm và toàn văn bản, nhưng tôi chưa muốn làm phức tạp vấn đề cho bạn.


2

Các chỉ mục về cơ bản là các cấu trúc dữ liệu bổ sung phải được xây dựng và lưu trữ. Xây dựng inde gây lãng phí năng lượng CPU (trong quá trình ghi) và lưu trữ sẽ lãng phí dung lượng đĩa.

Tại sao bạn muốn xây dựng và lưu trữ các chỉ mục mà bạn không bao giờ sử dụng?


Đây là một câu hỏi lý thuyết thuần túy ("nếu / tại sao không").
Dragos

@Dragos Tôi nghĩ rằng câu trả lời cho những câu hỏi đó là rõ ràng từ bài viết của tôi: Nếu bạn đã làm, mọi thao tác viết sẽ chậm hơn rất nhiều và mọi bản ghi sẽ lãng phí rất nhiều dung lượng đĩa. Tại sao không? Bởi vì sức mạnh CPU và lưu trữ đĩa là đắt tiền.
Matěj Zábský

2

Chỉ đặt chỉ mục khi cần thiết. Như một quy tắc tự nhiên khi tôi đang phát triển một lược đồ cơ sở dữ liệu, mỗi bảng sẽ có một Chỉ số cụm chính khóa PK để bắt đầu. Đây sẽ là định danh duy nhất cho dữ liệu trong bảng đó. Trong có thể trên 1 cột hoặc nhiều.

Sau đó, tôi thường chỉ thêm các Chỉ mục duy nhất không phân cụm trên (các) cột mà tôi muốn thực thi tính duy nhất trên.

Đây là lược đồ cơ sở. Khi ứng dụng được phát triển và đáo hạn, chúng tôi sẽ thêm các chỉ mục khi cần dựa trên mối quan tâm về hiệu suất và cách chúng tôi truy vấn dữ liệu.

Mỗi chỉ số được thêm vào tăng khoảng cách sử dụng cũng như thêm bảo trì bổ sung. Vì vậy, chọn chỉ số của bạn một cách khôn ngoan.


Trong khi đọc câu trả lời của bạn, một câu hỏi khác xuất hiện trong đầu tôi: Các khóa chính thường được lập chỉ mục tự động hay tôi phải tự xác định rằng chúng sẽ được lập chỉ mục? Nói, ví dụ, trong một cơ sở dữ liệu MySQL?
Dragos

Có, khóa chính sẽ tự động tạo một chỉ mục được nhóm cho (Máy chủ SQL) của bạn. Chỉ có một khóa chính, do đó chỉ có một chỉ mục được nhóm trên mỗi bảng. MySQL nên tương tự nhưng có lẽ một chuyên gia MySQL có thể xác nhận.
Jon Raynor

2

Điểm mạnh của Index là chúng có 1) cấu trúc dữ liệu có thể được tìm kiếm nhanh chóng và 2) nhỏ gọn hơn các bảng thực tế, cho phép nhiều chỉ số phù hợp với bộ nhớ thay vì được phân trang vào đĩa.

Nếu bạn có một chỉ mục trên mỗi cột, thì chính các chỉ mục sẽ chiếm nhiều không gian hơn bảng mà chúng đại diện. Nếu cơ sở dữ liệu thực sự sử dụng tất cả các chỉ mục, nó sẽ cần nhiều thời gian hơn chỉ để trao đổi chúng vào và ra khỏi bộ nhớ. Ngoài ra, mọi chỉ mục phải được cập nhật khi trơ, cập nhật hoặc xóa.

Ngoài ra, các chỉ mục trên một cột thậm chí không phải là tốt nhất bạn có thể làm. Hầu hết các cơ sở dữ liệu quan hệ thực sự cho phép một chỉ mục trên nhiều cột và thứ tự của các cột này quan trọng. Ví dụ: nếu tôi muốn tìm kiếm cơ sở dữ liệu cho tất cả những người đã đến Duke từ các lớp từ 1980 đến 1984, thì điều tôi muốn là một chỉ mục trên (School, ClassYear). Truy vấn sẽ không thể sử dụng một chỉ mục với cùng các cột, nhưng bị đảo ngược.

Vì vậy, để tạo mọi chỉ số có thể, có ít nhất n! cách để sắp xếp các cột trong một chỉ mục. Chỉ với 5 cột, có 120 chỉ mục có thể.

Vì có rất nhiều chỉ mục có thể, bạn thực sự phải xác định chỉ mục nào hữu ích cho ứng dụng của bạn và chỉ tạo những chỉ mục đó.


Nhưng trong ví dụ của bạn, hai chỉ mục: một trong trường và một chỉ mục khác trên ClassYear có hữu ích trong bất kỳ trường hợp nào không?
Dragos

@Dragos Chắc chắn, họ có thể. Nếu tôi có một truy vấn khác chỉ qua Năm học (tất cả học sinh đã đến trường trong lớp 2004) thì chỉ số Năm học có thể hữu ích. Thật không may, có rất nhiều yếu tố mà công cụ truy vấn sử dụng khi quyết định sử dụng chỉ mục nào khi nào. Nếu nó chỉ ra rằng một nửa số người trong cơ sở dữ liệu đã đi học vào năm 2004, thì cơ sở dữ liệu có thể chỉ cần bỏ qua chỉ mục và quét toàn bộ bảng. Nếu bạn muốn làm tốt điều này, hãy bắt đầu sử dụng và đọc các kế hoạch thực hiện
Chris Pitman

Ý tôi là, nếu tôi có các chỉ mục riêng biệt ở Trường và ClssYear, liệu chúng có hữu ích khi tìm kiếm tất cả những người đã đến Duke từ các lớp từ 1980 đến 1984 không?
Dragos

@Dragos Nó phụ thuộc vào công cụ db cụ thể. Ví dụ, Postgres sẽ sử dụng thứ gọi là Quét chỉ mục Bitmap để giao kết quả của nhiều chỉ mục. Tùy thuộc vào công cụ truy vấn để quyết định sử dụng chỉ mục nào và điều này sẽ luôn là db cụ thể.
Chris Pitman

2

Tạo một chỉ mục cho mỗi cột trong bảng thường là một sự lãng phí không gian và như những người khác đã đề cập, nó có thể làm chậm các hoạt động chèn / cập nhật. Một chỉ mục được sử dụng để tăng tốc truy vấn. Tôi chỉ khuyên bạn nên thêm một chỉ mục vào một cột nếu bạn nhận thấy hiệu suất kém khi truy vấn các giá trị trong cột đó.

Một số cơ sở dữ liệu có thể yêu cầu một chỉ mục cho khóa chính của bảng để bạn có thể không có lựa chọn nào về khóa đó. Ngoài ra, nếu bạn có một cột văn bản rất lớn, có những công nghệ cụ thể được thiết kế để tìm kiếm và lập chỉ mục toàn văn bản, nhưng chúng không phải luôn luôn là cùng loại chỉ mục bạn sử dụng cho một cột số nhỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.