Làm thế nào để lập chỉ mục cơ sở dữ liệu? [đóng cửa]


2420

Cho rằng việc lập chỉ mục rất quan trọng khi tập dữ liệu của bạn tăng kích thước, ai đó có thể giải thích cách lập chỉ mục hoạt động ở mức độ không xác định cơ sở dữ liệu không?

Để biết thông tin về các truy vấn để lập chỉ mục một trường, hãy xem Làm cách nào để lập chỉ mục một cột cơ sở dữ liệu .

Câu trả lời:


3547

Tại sao cần thiết?

Khi dữ liệu được lưu trữ trên các thiết bị lưu trữ dựa trên đĩa, nó được lưu trữ dưới dạng các khối dữ liệu. Các khối này được truy cập toàn bộ, làm cho chúng hoạt động truy cập đĩa nguyên tử. Các khối đĩa được cấu trúc theo cách tương tự như các danh sách được liên kết; cả hai đều chứa một phần cho dữ liệu, một con trỏ đến vị trí của nút (hoặc khối) tiếp theo và cả hai không cần phải được lưu trữ liên tục.

Do thực tế là một số bản ghi chỉ có thể được sắp xếp trên một trường, chúng tôi có thể nói rằng tìm kiếm trên một trường không được sắp xếp yêu cầu Tìm kiếm tuyến tính yêu cầu N/2truy cập khối (trung bình), trong đó Nsố lượng khối là cái bàn kéo dài. Nếu trường đó là trường không khóa (nghĩa là không chứa các mục duy nhất) thì toàn bộ không gian bảng phải được tìm kiếm tại Ncác truy cập khối.

Trong khi với một trường được sắp xếp, Tìm kiếm nhị phân có thể được sử dụng, có quyền log2 Ntruy cập khối. Ngoài ra, vì dữ liệu được sắp xếp theo trường không khóa, phần còn lại của bảng không cần tìm kiếm các giá trị trùng lặp, khi tìm thấy giá trị cao hơn. Do đó, hiệu suất tăng là đáng kể.

Lập chỉ mục là gì?

Lập chỉ mục là một cách sắp xếp một số bản ghi trên nhiều lĩnh vực. Tạo một chỉ mục trên một trường trong bảng sẽ tạo ra một cấu trúc dữ liệu khác chứa giá trị trường và một con trỏ tới bản ghi mà nó liên quan. Cấu trúc chỉ mục này sau đó được sắp xếp, cho phép Tìm kiếm nhị phân được thực hiện trên nó.

Nhược điểm của việc lập chỉ mục là các chỉ mục này yêu cầu không gian bổ sung trên đĩa do các chỉ mục được lưu trữ cùng nhau trong một bảng bằng công cụ MyISAM, tệp này có thể nhanh chóng đạt đến giới hạn kích thước của hệ thống tệp bên dưới nếu nhiều trường trong cùng một bảng được lập chỉ mục .

Làm thế nào nó hoạt động?

Đầu tiên, hãy phác thảo một lược đồ bảng cơ sở dữ liệu mẫu;

Tên trường Kiểu dữ liệu Kích thước trên đĩa
id (Khóa chính) INT 4 byte không dấu
FirstName Char (50) 50 byte
LastName Char (50) 50 byte
emailAddress Char (100) 100 byte

Lưu ý : char đã được sử dụng thay cho varchar để cho phép kích thước chính xác trên giá trị đĩa. Cơ sở dữ liệu mẫu này chứa năm triệu hàng và không được lập trình. Hiệu suất của một số truy vấn bây giờ sẽ được phân tích. Đây là một truy vấn sử dụng id (trường khóa được sắp xếp) và một truy vấn sử dụng FirstName (trường không được sắp xếp không khóa).

Ví dụ 1 - sắp xếp so với các trường chưa sắp xếp

Dựa vào cơ sở dữ liệu mẫu của chúng tôi về các r = 5,000,000bản ghi có kích thước cố định cho độ dài bản ghi R = 204byte và chúng được lưu trữ trong một bảng bằng cách sử dụng công cụ MyISAM đang sử dụng các B = 1,024byte kích thước khối mặc định . Hệ số chặn của bảng sẽ là bfr = (B/R) = 1024/204 = 5các bản ghi trên mỗi khối đĩa. Tổng số khối cần thiết để giữ bảng là N = (r/bfr) = 5000000/5 = 1,000,000các khối.

Một tìm kiếm tuyến tính trên trường id sẽ yêu cầu trung bình các N/2 = 500,000truy cập khối để tìm giá trị, với điều kiện trường id là trường khóa. Nhưng vì trường id cũng được sắp xếp, nên việc tìm kiếm nhị phân có thể được tiến hành yêu cầu trung bình số log2 1000000 = 19.93 = 20lượt truy cập khối. Ngay lập tức chúng ta có thể thấy đây là một sự cải thiện mạnh mẽ.

Bây giờ trường FirstName không được sắp xếp cũng không phải là trường khóa, vì vậy không thể tìm kiếm nhị phân, cũng không phải là các giá trị duy nhất và do đó bảng sẽ yêu cầu tìm kiếm đến cuối để N = 1,000,000truy cập khối chính xác . Đây là tình huống mà chỉ mục nhằm mục đích để sửa chữa.

Cho rằng một bản ghi chỉ mục chỉ chứa trường được lập chỉ mục và một con trỏ tới bản ghi gốc, lý do là nó sẽ nhỏ hơn bản ghi đa trường mà nó trỏ tới. Vì vậy, bản thân chỉ mục yêu cầu ít khối đĩa hơn bảng gốc, do đó yêu cầu ít truy cập khối hơn để lặp qua. Lược đồ cho một chỉ mục trên trường FirstName được nêu dưới đây;

Tên trường Kiểu dữ liệu Kích thước trên đĩa
FirstName Char (50) 50 byte
(con trỏ bản ghi) 4 byte đặc biệt

Lưu ý : Con trỏ trong MySQL có độ dài 2, 3, 4 hoặc 5 byte tùy thuộc vào kích thước của bảng.

Ví dụ 2 - lập chỉ mục

Đưa ra cơ sở dữ liệu mẫu các r = 5,000,000bản ghi của chúng tôi với độ dài bản ghi chỉ số của R = 54byte và sử dụng B = 1,024byte kích thước khối mặc định . Hệ số chặn của chỉ mục sẽ là bfr = (B/R) = 1024/54 = 18các bản ghi trên mỗi khối đĩa. Tổng số khối cần thiết để giữ chỉ mục là N = (r/bfr) = 5000000/18 = 277,778các khối.

Bây giờ một tìm kiếm sử dụng trường FirstName có thể sử dụng chỉ mục để tăng hiệu suất. Điều này cho phép tìm kiếm nhị phân của chỉ mục với số lần log2 277778 = 18.08 = 19truy cập khối trung bình . Để tìm địa chỉ của bản ghi thực tế, yêu cầu quyền truy cập khối tiếp theo để đọc, đưa tổng số 19 + 1 = 20truy cập chặn, khác xa so với truy cập khối 1.000.000 được yêu cầu để tìm kết quả trùng khớp FirstName trong bảng không được lập chỉ mục.

Nó nên được sử dụng lúc nào?

Do việc tạo một chỉ mục yêu cầu không gian đĩa bổ sung (277.778 khối bổ sung từ ví dụ trên, tăng ~ 28%) và quá nhiều chỉ số có thể gây ra sự cố phát sinh từ giới hạn kích thước hệ thống tệp, phải sử dụng cẩn thận để chọn đúng các trường để lập chỉ mục.

Vì các chỉ mục chỉ được sử dụng để tăng tốc độ tìm kiếm trường phù hợp trong các bản ghi, nên lý do là các trường lập chỉ mục được sử dụng cho đầu ra sẽ chỉ đơn giản là lãng phí không gian đĩa và thời gian xử lý khi thực hiện thao tác chèn hoặc xóa, và do đó nên tránh. Cũng với bản chất của tìm kiếm nhị phân, tính chính xác hoặc tính duy nhất của dữ liệu là quan trọng. Lập chỉ mục trên một lĩnh vực có số lượng thẻ là 2 sẽ chia dữ liệu thành một nửa, trong khi đó số lượng thẻ là 1.000 sẽ trả về khoảng 1.000 bản ghi. Với số lượng cardin thấp như vậy, hiệu quả sẽ giảm xuống thành một loại tuyến tính và trình tối ưu hóa truy vấn sẽ tránh sử dụng chỉ mục nếu cardinality nhỏ hơn 30% số lượng bản ghi, làm cho chỉ mục trở nên lãng phí không gian.


8
tìm kiếm nhị phân có thể được thực hiện khi dữ liệu là duy nhất, phải không? mặc dù bạn đã đề cập rằng cardinality tối thiểu rất quan trọng, thuật toán sẽ không phải là một tìm kiếm nhị phân đơn giản, việc xấp xỉ này (~ log2 n) sẽ ảnh hưởng đến thời gian xử lý như thế nào?
gội đầu

9
@AbhishekShivkumar: Câu hỏi tuyệt vời! Tôi nghĩ bảng chỉ mục sẽ có nhiều hàng như trong bảng dữ liệu. Và vì trường này sẽ chỉ có 2 giá trị (boolean với true / false) và nói rằng bạn muốn một bản ghi có giá trị là true, nên bạn chỉ có thể giảm một nửa kết quả được đặt trong lần đầu tiên, trong lần thứ hai, tất cả các bản ghi của bạn đều có giá trị đúng vì vậy không có cơ sở để phân biệt, bây giờ bạn phải tìm kiếm bảng dữ liệu theo kiểu tuyến tính - do đó, ông nói rằng nên cân nhắc tính chính xác trong khi quyết định cột được lập chỉ mục. Trong trường hợp này, việc lập chỉ mục trên một cột như vậy là vô ích. Hy vọng tôi đúng :)
Saurabh Patil

7
không nên số lượng truy cập khối trong trường hợp trung bình là (N+1)/2. Nếu chúng ta tổng số lượng truy cập khối cho tất cả các trường hợp có thể và chia nó cho số lượng các trường hợp, thì chúng ta sẽ có N*(N+1)/(2*n)được (N+1)/2.
Ajay

31
Tôi nghĩ rằng có một vài lỗi chính tả trong câu trả lời này, ví dụ, trong câu: "khác xa so với truy cập khối 277.778 được yêu cầu bởi bảng không được lập chỉ mục." không phải tác giả có nghĩa là truy cập khối 1.000.000? 277.778 là số khối được yêu cầu bởi chính chỉ mục. Dường như cũng có một vài điểm không chính xác khác :(
jcm

5
@jcm Ông đã giải thích nó trong phần "Lập chỉ mục là gì" - "Lập chỉ mục là cách sắp xếp một số bản ghi trên nhiều trường. Tạo một chỉ mục trên một trường trong bảng sẽ tạo một cấu trúc dữ liệu khác chứa giá trị trường và con trỏ đến bản ghi mà nó liên quan đến. Cấu trúc chỉ mục này sau đó được sắp xếp, cho phép Tìm kiếm nhị phân được thực hiện trên nó. "
grinch

295

Ví dụ kinh điển "Index in Books"

Hãy xem xét một "Cuốn sách" gồm 1000 trang, chia cho 10 Chương, mỗi phần có 100 trang.

Đơn giản hả?

Bây giờ, hãy tưởng tượng bạn muốn tìm một Chương cụ thể có chứa từ " Nhà giả kim ". Không có trang chỉ mục, bạn không có lựa chọn nào khác ngoài quét toàn bộ sách / Chương. tức là: 1000 trang.

Sự tương tự này được gọi là "Quét toàn bộ bảng" trong thế giới cơ sở dữ liệu.

nhập mô tả hình ảnh ở đây

Nhưng với một trang chỉ mục, bạn biết nơi để đi! Và hơn nữa, để tra cứu bất kỳ Chương cụ thể nào quan trọng, bạn chỉ cần xem qua trang chỉ mục, lặp đi lặp lại, mọi lúc. Sau khi tìm thấy chỉ số phù hợp, bạn có thể chuyển sang chương đó một cách hiệu quả bằng cách bỏ qua phần còn lại.

Nhưng sau đó, ngoài 1000 trang thực tế, bạn sẽ cần thêm ~ 10 trang để hiển thị các chỉ số, hoàn toàn là 1010 trang.

Do đó, chỉ mục là một phần riêng biệt lưu trữ các giá trị của cột + con trỏ được lập chỉ mục vào hàng được lập chỉ mục theo thứ tự được sắp xếp để tra cứu hiệu quả.

Mọi thứ thật đơn giản phải không? : P


24
tương tự thực sự tốt đẹp! buồn cười là tôi đã không tạo được mối liên hệ giữa chỉ mục sách và chỉ mục db
Yolo Voe

2
Điều này khiến tôi suy nghĩ Libraryhoặc Grocery Store bạn có thể hình ảnh không có chỉ số tại một cửa hàng tạp hóa? Where's The Beef?!? Oh its next to the Restrooms, a mop, and makeup
JayRizzo

3
"Nhưng với một trang chỉ mục ở đầu, bạn đang ở đó." "Bạn đang ở đó" nghĩa là gì?
Dĩa nhựa

2
Các chỉ số thường đi ở mặt sau của sách, trong khi một bảng nội dung ở phía trước. Nhưng, điều đó làm cho sự tương tự thậm chí còn tốt hơn, vì thứ tự cột không quan trọng.
hạn

1
Giải thích của bạn rất dễ đưa vào. Những người khác có xu hướng sử dụng các thuật ngữ tinh vi để giải thích mọi thứ. Tôi ước tôi có thể cung cấp nhiều hơn một upvote.
emeraldhieu

241

Lần đầu tiên tôi đọc nó, nó rất hữu ích cho tôi. Cảm ơn bạn.

Kể từ đó tôi đã hiểu rõ hơn về nhược điểm của việc tạo chỉ mục: nếu bạn viết vào một bảng ( UPDATEhoặc INSERT) với một chỉ mục, bạn thực sự có hai thao tác ghi trong hệ thống tệp. Một cho dữ liệu bảng và một cho dữ liệu chỉ mục (và sử dụng dữ liệu bảng (và - nếu được phân cụm - sử dụng dữ liệu bảng)). Nếu bảng và chỉ mục được đặt trên cùng một đĩa cứng, điều này sẽ tốn nhiều thời gian hơn. Do đó, một bảng không có chỉ mục (một đống), sẽ cho phép các thao tác ghi nhanh hơn. (nếu bạn có hai chỉ mục, bạn sẽ kết thúc bằng ba thao tác ghi, v.v.)

Tuy nhiên, việc xác định hai vị trí khác nhau trên hai đĩa cứng khác nhau cho dữ liệu chỉ mục và dữ liệu bảng có thể giảm / loại bỏ vấn đề tăng chi phí thời gian. Điều này đòi hỏi định nghĩa của các nhóm tệp bổ sung với các tệp theo đĩa cứng mong muốn và định nghĩa vị trí bảng / chỉ mục như mong muốn.

Một vấn đề khác với các chỉ mục là sự phân mảnh của chúng theo thời gian khi dữ liệu được chèn vào. REORGANIZEgiúp đỡ, bạn phải viết các thói quen để hoàn thành nó.

Trong một số trường hợp nhất định, một đống có ích hơn một bảng có chỉ mục,

ví dụ: - Nếu bạn có nhiều bài viết đối thủ nhưng chỉ đọc một đêm ngoài giờ làm việc để báo cáo.

Ngoài ra, sự khác biệt giữa các chỉ mục được phân cụm và không phân cụm là khá quan trọng.

Giúp tôi: - Chỉ số Clustered và Non cluster thực sự có ý nghĩa gì?


3
Tôi nghĩ, những vấn đề lập chỉ mục này có thể được giải quyết bằng cách duy trì hai cơ sở dữ liệu khác nhau, giống như Master và Slave. Trường hợp Master có thể được sử dụng để chèn hoặc cập nhật hồ sơ. Không có chỉ mục. Và nô lệ có thể được sử dụng để đọc với chỉ mục thích hợp phải không ???
bharatesh

14
không, sai, xin lỗi không chỉ nội dung của các bảng phải được cập nhật, mà cả cấu trúc và nội dung chỉ mục (b-cây, nút). khái niệm của bạn về chủ và nô lệ không có ý nghĩa ở đây. những gì có thể khả thi mặc dù là sao chép hoặc phản chiếu đến cơ sở dữ liệu thứ hai mà phân tích diễn ra để lấy khối lượng công việc đó ra khỏi cơ sở dữ liệu đầu tiên. cơ sở dữ liệu thứ hai sẽ chứa các bản sao dữ liệu chỉ mục trên dữ liệu đó.
Der U

3
Ừm ...! Hãy cố gắng đọc bình luận của tôi và hiểu nó đúng. Tôi cũng nói tương tự, tôi gọi chủ và nô lệ (bất cứ điều gì) là "ứng dụng hoặc phản chiếu cơ sở dữ liệu thứ hai mà phân tích diễn ra để lấy khối lượng công việc đó khỏi cơ sở dữ liệu thứ nhất. Cơ sở dữ liệu thứ hai sẽ giữ các bản sao dữ liệu và chỉ mục dữ liệu đó "
bharatesh

6
cơ sở dữ liệu thứ hai - mà việc phản chiếu hoặc sao chép được thực hiện, nô lệ - sẽ trải nghiệm tất cả các thao tác dữ liệu như cơ sở dữ liệu đầu tiên. với mỗi thao tác dml, các chỉ mục trên cơ sở dữ liệu thứ hai đó sẽ gặp "các vấn đề lập chỉ mục" này. Tôi không thấy được lợi ích trong đó, khi nào các chỉ số là cần thiết và được xây dựng để phân tích nhanh, chúng cần được cập nhật.
Der U

231

Một chỉ mục chỉ là một cấu trúc dữ liệu giúp tìm kiếm nhanh hơn cho một cột cụ thể trong cơ sở dữ liệu. Cấu trúc này thường là một cây b hoặc bảng băm nhưng nó có thể là bất kỳ cấu trúc logic nào khác.


29
+1 lần một triệu cho câu trả lời này, vì tôi đã tìm thấy danh sách này trong khi cố gắng tìm một lời giải thích đơn giản về việc lập chỉ mục về cơ bản là gì.
Josh Burson

1
Chúng ta hãy lưu ý rằng "chỉ là một cấu trúc dữ liệu" không có nghĩa là "bổ sung cho dữ liệu". Đôi khi nó là (ví dụ: "chỉ mục không phân cụm"), đôi khi nó xác định bố cục của dữ liệu (ví dụ: "chỉ mục cụm").
Pablo H

161

Bây giờ, hãy nói rằng chúng tôi muốn chạy một truy vấn để tìm tất cả các chi tiết của bất kỳ nhân viên nào được đặt tên là 'Abc'?

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

Điều gì sẽ xảy ra nếu không có chỉ số?

Phần mềm cơ sở dữ liệu theo nghĩa đen sẽ phải xem xét từng hàng trong bảng Nhân viên để xem liệu Employee_Name cho hàng đó có phải là 'Abc' hay không. Và, bởi vì chúng tôi muốn mọi hàng có tên 'Abc' bên trong nó, chúng tôi không thể ngừng tìm kiếm một khi chúng tôi chỉ tìm thấy một hàng có tên 'Abc', bởi vì có thể có các hàng khác có tên Abc . Vì vậy, mỗi hàng cho đến hàng cuối cùng phải được tìm kiếm - có nghĩa là hàng ngàn hàng trong kịch bản này sẽ phải được cơ sở dữ liệu kiểm tra để tìm các hàng có tên 'Abc'. Đây là những gì được gọi là quét toàn bộ bảng

Làm thế nào một chỉ mục cơ sở dữ liệu có thể giúp hiệu suất

Toàn bộ quan điểm của việc có một chỉ mục là tăng tốc các truy vấn tìm kiếm bằng cách cắt giảm số lượng bản ghi / hàng trong một bảng cần được kiểm tra. Chỉ mục là cấu trúc dữ liệu (phổ biến nhất là cây B) lưu trữ các giá trị cho một cột cụ thể trong bảng.

Làm thế nào để chỉ số cây B hoạt động?

Lý do cây B là cấu trúc dữ liệu phổ biến nhất cho các chỉ mục là do chúng có hiệu quả về thời gian - bởi vì việc tra cứu, xóa và chèn đều có thể được thực hiện trong thời gian logarit. Và, một lý do chính khác khiến cây B- được sử dụng phổ biến hơn là vì dữ liệu được lưu trữ bên trong cây B có thể được sắp xếp. RDBMS thường xác định cấu trúc dữ liệu nào thực sự được sử dụng cho một chỉ mục. Nhưng, trong một số trường hợp với một số RDBMS nhất định, bạn thực sự có thể chỉ định cấu trúc dữ liệu nào bạn muốn cơ sở dữ liệu của mình sử dụng khi bạn tự tạo chỉ mục.

Làm thế nào để một chỉ số bảng băm hoạt động?

Lý do các chỉ mục băm được sử dụng là vì các bảng băm cực kỳ hiệu quả khi chỉ tìm kiếm các giá trị. Vì vậy, các truy vấn so sánh sự bằng nhau với một chuỗi có thể truy xuất các giá trị rất nhanh nếu chúng sử dụng chỉ mục băm.

Chẳng hạn, truy vấn mà chúng ta đã thảo luận trước đó có thể được hưởng lợi từ chỉ mục băm được tạo trên cột Employee_Name. Cách một chỉ mục băm hoạt động là giá trị cột sẽ là khóa vào bảng băm và giá trị thực được ánh xạ tới khóa đó sẽ chỉ là một con trỏ tới dữ liệu hàng trong bảng. Do bảng băm về cơ bản là một mảng kết hợp, một mục tiêu biểu sẽ trông giống như Ab Abc => 0x28939, trong đó 0x28939 là tham chiếu đến hàng của bảng nơi Abc được lưu trong bộ nhớ. Tra cứu một giá trị như từ Abc Cuộc sống trong một chỉ mục bảng băm và nhận lại một tham chiếu đến hàng trong bộ nhớ rõ ràng là nhanh hơn rất nhiều so với việc quét bảng để tìm tất cả các hàng có giá trị của Abc Abc trong cột Employee_Name.

Những nhược điểm của chỉ số băm

Các bảng băm không được sắp xếp cấu trúc dữ liệu và có nhiều loại truy vấn mà chỉ mục băm thậm chí không thể giúp được. Chẳng hạn, giả sử bạn muốn tìm hiểu tất cả những nhân viên dưới 40 tuổi. Làm thế nào bạn có thể làm điều đó với một chỉ số bảng băm? Chà, điều đó là không thể bởi vì bảng băm chỉ tốt khi tìm kiếm các cặp giá trị chính - có nghĩa là các truy vấn kiểm tra sự bằng nhau

Chính xác những gì bên trong một chỉ mục cơ sở dữ liệu? Vì vậy, bây giờ bạn biết rằng một chỉ mục cơ sở dữ liệu được tạo trên một cột trong bảng và chỉ mục đó lưu trữ các giá trị trong cột cụ thể đó. Nhưng, điều quan trọng là phải hiểu rằng một chỉ mục cơ sở dữ liệu không lưu trữ các giá trị trong các cột khác của cùng một bảng. Ví dụ: nếu chúng ta tạo một chỉ mục trên cột Employee_Name, điều này có nghĩa là các giá trị cột Employee_Age và Employee_Address cũng không được lưu trữ trong chỉ mục. Nếu chúng ta chỉ lưu trữ tất cả các cột khác trong chỉ mục, thì nó sẽ giống như việc tạo một bản sao khác của toàn bộ bảng - sẽ chiếm quá nhiều không gian và sẽ rất kém hiệu quả.

Làm thế nào để một cơ sở dữ liệu biết khi nào nên sử dụng một chỉ mục? Khi một truy vấn như LỰA CHỌN * TỪ nhân viên WHERE Employee_Name = 'Abc' 'được chạy, cơ sở dữ liệu sẽ kiểm tra xem có chỉ mục nào trên cột được truy vấn không. Giả sử cột Employee_Name có một chỉ mục được tạo trên đó, cơ sở dữ liệu sẽ phải quyết định xem có thực sự sử dụng chỉ mục để tìm các giá trị được tìm kiếm hay không - bởi vì có một số trường hợp sử dụng chỉ mục cơ sở dữ liệu thực sự kém hiệu quả hơn và hiệu quả hơn chỉ là quét toàn bộ bảng.

Chi phí để có một chỉ số cơ sở dữ liệu là gì?

Nó chiếm không gian - và bảng của bạn càng lớn, chỉ mục của bạn càng lớn. Một hiệu suất khác với các chỉ mục là thực tế là bất cứ khi nào bạn thêm, xóa hoặc cập nhật các hàng trong bảng tương ứng, các thao tác tương tự sẽ phải được thực hiện cho chỉ mục của bạn. Hãy nhớ rằng một chỉ mục cần chứa cùng một dữ liệu tối thiểu như bất cứ thứ gì có trong (các) cột trong bảng mà chỉ mục bao trùm.

Theo nguyên tắc chung, chỉ nên tạo một chỉ mục trên bảng nếu dữ liệu trong cột được lập chỉ mục sẽ được truy vấn thường xuyên.

Xem thêm

  1. Những cột thường làm cho chỉ số tốt?
  2. Làm thế nào để các chỉ mục cơ sở dữ liệu làm việc

4
"Chỉ mục cơ sở dữ liệu không lưu trữ các giá trị trong các cột khác" - không đúng.
mustaccio

2
@mustaccio: Chỉ mục lưu trữ tham chiếu của hàng với các cột được lập chỉ mục (theo như tôi biết). Tôi có thể sai. Bạn có bất kỳ tài liệu tham khảo nào nói rằng chỉ mục lưu trữ các giá trị cột khác không?
Somnath Muluk

3
@ To Downvoters: Bạn có thể giải thích những gì sai để tôi có thể cải thiện?
Somnath Muluk

2
Kiểm tra ví dụ phân cụm SQL Server hoặc CREATE INDEX ... INCLUDEmệnh đề của DB2 . Theo quan điểm của tôi, bạn có quá nhiều khái quát.
mustaccio

11
@mustaccio: Vì vậy, theo mặc định create indexkhông bao gồm các cột khác và tại sao nó nên. If we did just store all the other columns in the index, then it would be just like creating another copy of the entire table, which would take up way too much space and would be very inefficient.. Đây là phiên bản tổng quát hơn của các chỉ mục. CREATE INDEX ... INCLUDElà phiên bản mới hơn bằng cách xem xét các cột khác. Bài viết tôi đã giải thích là xem xét phiên bản tổng quát hơn. Làm thế nào các chỉ mục hoạt động sẽ là một cuốn sách nếu chúng ta xem xét tất cả các cơ sở dữ liệu? Phải không? Bạn có nghĩ rằng câu trả lời xứng đáng downvote?
Somnath Muluk

97

Mô tả đơn giản!

Chỉ mục không có gì ngoài cấu trúc dữ liệu lưu trữ các giá trị cho một cột cụ thể trong bảng. Một chỉ mục được tạo trên một cột của bảng.

Ví dụ: Chúng ta có một bảng cơ sở dữ liệu được gọi Uservới ba cột - Name, AgeAddress. Giả sử rằng Userbảng có hàng ngàn hàng.

Bây giờ, hãy nói rằng chúng tôi muốn chạy một truy vấn để tìm tất cả các chi tiết của bất kỳ người dùng nào được đặt tên là 'John'. Nếu chúng tôi chạy truy vấn sau:

SELECT * FROM User 
WHERE Name = 'John'

Phần mềm cơ sở dữ liệu theo nghĩa đen sẽ phải xem xét từng hàng trong Userbảng để xem liệu Namehàng đó có phải là 'John' hay không. Điều này sẽ mất một thời gian dài.

Đây là nơi indexgiúp chúng tôi: chỉ mục được sử dụng để tăng tốc các truy vấn tìm kiếm bằng cách cắt giảm số lượng bản ghi / hàng trong bảng cần được kiểm tra .

Cách tạo chỉ mục:

CREATE INDEX name_index
ON User (Name)

Một indexbao gồm các giá trị cột (Ví dụ: John) từ một bảng và các giá trị đó được lưu trữ trong cấu trúc dữ liệu .

Vì vậy, bây giờ cơ sở dữ liệu sẽ sử dụng chỉ mục để tìm nhân viên tên John vì chỉ mục có thể sẽ được sắp xếp theo thứ tự abc theo tên Người dùng. Và, bởi vì nó được sắp xếp, điều đó có nghĩa là việc tìm kiếm một cái tên nhanh hơn rất nhiều bởi vì tất cả các tên bắt đầu bằng một J JJ sẽ ở ngay cạnh nhau trong chỉ mục!


1
Một chỉ mục không ngụ ý sắp xếp thứ tự trên cột
oligofren

4
Cảm ơn. Điều này đã giúp tôi hiểu. Vì vậy, về cơ bản một chỉ mục là một bản sao của dữ liệu cột đã được sắp xếp. Thông thường dữ liệu cột chỉ theo thứ tự dữ liệu được chèn.
Neil

34

Chỉ là một gợi ý nhanh .. Vì việc lập chỉ mục tốn thêm không gian ghi và lưu trữ, vì vậy nếu ứng dụng của bạn yêu cầu thêm thao tác chèn / cập nhật, bạn có thể muốn sử dụng các bảng không có chỉ mục, nhưng nếu nó yêu cầu nhiều thao tác truy xuất dữ liệu hơn, bạn nên đi lập chỉ mục bàn.


6
Đây là một nhận xét, không phải là một câu trả lời.
RonJohn

5
Nó rõ ràng hơn và do đó hữu ích hơn theo cách này vì nó là một nhận xét chung. Câu trả lời nào nên được thêm vào như một bình luận?
pfabri

1
có lẽ là một nhận xét về OP
Guyarad

33

Chỉ cần nghĩ về Index Index là Index của một cuốn sách.

Nếu bạn có một cuốn sách về những chú chó và bạn muốn tìm một thông tin về giả sử, Người chăn cừu Đức, tất nhiên bạn có thể lật qua tất cả các trang của cuốn sách và tìm thấy những gì bạn đang tìm kiếm - nhưng điều này tất nhiên là tốn thời gian và không rất nhanh.

Một tùy chọn khác là, bạn có thể chỉ cần đi tới phần Chỉ mục của cuốn sách và sau đó tìm thấy những gì bạn đang tìm kiếm bằng cách sử dụng Tên của thực thể bạn đang tìm kiếm (trong trường hợp này là Người chăn cừu Đức) và cũng có thể nhìn vào số trang để nhanh chóng tìm thấy những gì bạn đang tìm kiếm.

Trong Cơ sở dữ liệu, số trang được gọi là một con trỏ chỉ dẫn cơ sở dữ liệu đến địa chỉ trên đĩa nơi đặt thực thể. Sử dụng cùng một cách tương tự Người chăn cừu Đức, chúng ta có thể có một cái gì đó giống như thế này (Cúc Đức chăn cừu, 0x77129) trong đó 0x77129là địa chỉ trên đĩa nơi lưu trữ dữ liệu hàng cho Người chăn cừu Đức.

Nói tóm lại, chỉ mục là cấu trúc dữ liệu lưu trữ các giá trị cho một cột cụ thể trong bảng để tăng tốc tìm kiếm truy vấn.

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.