Liệu làm cho một lĩnh vực duy nhất làm cho nó được lập chỉ mục?


10

Nếu tôi tạo một uniqueràng buộc trên một trường, tôi cũng cần tạo một chỉ mục trên trường đó để có được thời gian chèn có thể mở rộng? Hoặc điều này được thực hiện cho tôi (ngay cả khi chỉ mục mà nó sử dụng không thể truy cập công khai?)

Cụ thể, tôi đang làm việc với Apache Derby để tạo mẫu, mặc dù tôi có thể sẽ chuyển nó sang MySQL trong tương lai gần. Tôi cũng hy vọng có thể có một cái gì đó trong tiêu chuẩn SQL nói lên điều gì đó về điều này.

Tôi sẽ không bao giờ có nhu cầu tìm kiếm theo lĩnh vực này, vì vậy tôi thà không tạo ra một chỉ mục vô dụng. Nhưng tôi muốn có một chỉ số vô dụng hơn là có O(n)thời gian chèn.


2
Từ những gì tôi biết, một ràng buộc duy nhất được triển khai đằng sau bằng cách sử dụng một chỉ mục duy nhất. Bạn có thể thấy một số ý kiến ​​liên quan đến tình huống này trong câu hỏi này: khi nào nên sử dụng ràng buộc duy nhất thay vì một chỉ mục duy nhất?
Mary

@Mary cảm ơn vì liên kết đó. Nó rất sâu sắc.
corsiKa

Câu trả lời:


2

--BIÊN TẬP--

Câu trả lời ban đầu của tôi (bên dưới) có lẽ không hữu ích cho bạn vì nó không giải quyết được câu hỏi về các uniqueràng buộc. Như những người khác đã nói, những ràng buộc này thường được thực hiện với một chỉ mục duy nhất ngụ ý. Trong trường hợp đặc biệt, điều này có thể không đúng (ví dụ: disable novalidateđối với Oracle).

Câu hỏi có thể là: Có thể thực thi tính duy nhất mà không có chỉ mục không? Nói chung, câu trả lời là không, mặc dù trong một số trường hợp, Chỉ mục cụm sẽ có nghĩa là chỉ mục và bảng là cùng một đối tượng.

- GỬI EDIT--

Bạn đã nói "Tôi muốn có một chỉ mục vô dụng hơn là có thời gian chèn O (n).", Nhưng trong các cơ sở dữ liệu chung không có thời gian chèn O (n). Có hai trường hợp để xem xét:

  1. Một bảng bình thường có hoặc không có chỉ mục:

    Các hàng mới được đổ ở đầu đống. RDBMS có lẽ chỉ nhìn vào 1 khối, vì vậy không chỉ O (1) mà rất nhỏ O (1).

    Nếu bảng có chỉ mục, một con trỏ tới hàng sẽ được thêm vào mỗi bảng. Đây thường sẽ là một hoạt động O (log (n)).

  2. Một bảng với một số loại phân cụm đang diễn ra, ví dụ: Bảng tổ chức chỉ mục hoặc cụm cho Oracle hoặc Chỉ mục cụm cho SQL Server và các bảng khác:

    Các hàng mới được chèn vào một khối cụ thể, điều này có thể khiến khối bị tách hoặc tràn, nhưng dù có xảy ra thì nó vẫn là O (log (n)) hoặc tốt hơn , do cây b hoặc cấu trúc tương tự được sử dụng để tìm khối.


Nhưng tính duy nhất không có chỉ mục sẽ là O(n)do bạn phải kiểm tra toàn bộ bảng. Đó là những gì tôi đang cố gắng tránh.
corsiKa

Đây thực sự là câu trả lời tốt nhất cho câu hỏi này !!! +1
RolandoMySQLDBA

@Trick - vâng, lúc đầu tôi hiểu nhầm. Chỉ số là giá bạn phải trả cho ràng buộc về tính duy nhất mà tôi sợ. Bạn có thể sử dụng một Chỉ số cụm trong trường hợp của bạn?
Jack nói hãy thử topanswers.xyz

1
@JackPDougless Tôi có thể sử dụng một "chỉ mục" tiêu chuẩn và nhận được O(lg n)thời gian chèn. Đó không phải là vấn đề. Câu hỏi của tôi là hệ thống, biết rằng bạn cần chỉ mục đó để có thời gian chèn hợp lý, tạo một chỉ mục cho tôi.
corsiKa

2

KHÓA CHÍNH> = ĐỘC ĐÁO> = INDEX == KEY

Dữ liệu InnoDB được sắp xếp theo PK. MyISAM PK hoạt động tương tự như ĐỘC ĐÁO.

INSERT phải thêm một "hàng" cho mỗi và mọi chỉ mục (dưới bất kỳ hình thức nào) mà bạn có. Điều này cần một chút thời gian. (Thường không đủ thời gian để quan trọng.) Các chỉ mục đều được lưu trữ ở định dạng BTree. Các khối BTIS của MyISAM là 1KB; InnoDB sử dụng 16KB.

Chèn vào InnoDB cập nhật đồng thời PK và dữ liệu.

Chèn vào MyISAM thường "nối" dữ liệu vào .MYD. Một cách riêng biệt, nó thêm một hàng vào PK (nếu có).

Trước tiên, INSERT phải xác minh rằng không có khóa trùng lặp cho bất kỳ khóa CHÍNH XÁC hoặc ĐỘC ĐÁO nào. Điều này được thực hiện bằng cách sử dụng chỉ mục. Và, do đó, tại sao các CONSTRAINT CHÍNH HÃNG và NGOẠI TỆ thực sự xây dựng các chỉ mục. Đây là O (logN), nhưng thường là CPU, không phải I / O, vì nếu bộ nhớ đệm hiệu quả.


Bạn có một trích dẫn trong thông số kỹ thuật của InnoDB nói rằng một UNIQUEràng buộc sẽ tạo ra một chỉ mục mà không cần người dùng chỉ định một ràng buộc sẽ được thực hiện?
corsiKa

Hmmm ... Không, chỉ là năm kinh nghiệm.
Rick James

Và đây là một cách để kiểm tra nó ... TẠO một bảng mà không có bất kỳ chỉ mục phụ nào; do SHOW TABLE STATUS - Index_length sẽ là 0. Sau đó thêm chỉ số UNIQUE; TABLE STATUS bây giờ sẽ hiển thị một cái gì đó. (Có thể phải đặt một lượng dữ liệu không tầm thường vào bảng.)
Rick James

1

Để trả lời cho câu hỏi in đậm: Có, làm cho một trường duy nhất không lập chỉ mục giống như khóa chính. Trên thực tế, tôi đã thảo luận vấn đề này trong một câu hỏi khác liên quan đến Khóa chính có Tên riêng để phân biệt với Khóa duy nhất (Ứng viên) khác .

Đối với các ràng buộc, các chỉ mục được tạo cho bạn để mô hình ràng buộc được thiết lập. Bạn sẽ có thể xóa các chỉ mục trùng lặp, thậm chí các khóa UNIQUE, miễn là các ràng buộc bạn đã thực hiện không tham chiếu các khóa UNIITE khác mà cá nhân bạn thực hiện ngoài mô hình ràng buộc.

Bạn có thể không bao giờ phải tìm kiếm trường này, nhưng MySQL chắc chắn sẽ phải theo đường dẫn của nó để xác định tính hợp lệ của các khóa và xác định cách thực hiện các thao tác TRÊN XÓA CASCADE và TRÊN CẬP NHẬT hoạt động CASCADE.

Chỉ số UNIQUE chỉ đơn giản đảm bảo tính duy nhất của các bộ dữ liệu (singletons, cặp, bộ ba, ..., n-tuples, v.v.) trong mỗi hàng trong bảng.

Theo ý của bạn là loại bỏ các chỉ mục trùng lặp như vậy, miễn là bạn không phá vỡ mô hình ràng buộc mà bạn muốn có bảng.


1
Điều này không trả lời câu hỏi của tôi. Câu hỏi của tôi liên quan đến thời gian chèn. Nếu bạn có một ràng buộc duy nhất, hệ thống phải đảm bảo tính duy nhất của trường trước khi chèn - nếu không có chỉ mục trên trường, nó sẽ phải tìm kiếm toàn bộ bảng ( O(n)). Nếu có một chỉ mục, việc tra cứu sẽ nhanh hơn nhiều (có thể O(lg n)). Đó là vấn đề của tôi. Tôi nhận thức rõ về các cơ chế toàn vẹn tham chiếu, tôi chỉ quan tâm (cho mục đích của câu hỏi này) về hiệu suất.
corsiKa
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.