Là một chỉ mục cần thiết cho một khóa chính trong SQLite?


130

Khi một cột số nguyên được đánh dấu là khóa chính trong bảng SQLite, một chỉ mục có nên được tạo rõ ràng cho nó không? SQLite dường như không tự động tạo một chỉ mục cho một cột khóa chính, nhưng có lẽ nó lập chỉ mục cho dù sao đi nữa, với mục đích của nó? (Tôi sẽ tìm kiếm trên cột đó mọi lúc).

Tình huống có khác với khóa chính không?

Câu trả lời:


148

Nó làm điều đó cho bạn.

Bỏ qua các cột CHÍNH HÃNG INTEGER, cả hai ràng buộc UNIITE và PRIMARY KEY được thực hiện bằng cách tạo một chỉ mục trong cơ sở dữ liệu (giống như câu lệnh "CREATE UNIQUE INDEX"). Một chỉ mục như vậy được sử dụng như bất kỳ chỉ mục nào khác trong cơ sở dữ liệu để tối ưu hóa các truy vấn. Kết quả là, thường không có lợi thế (nhưng chi phí đáng kể) trong việc tạo một chỉ mục trên một tập hợp các cột đã được tập hợp theo một ràng buộc CHÍNH HÃNG hoặc CHÍNH HÃNG.


8
Thật vậy, nó nói rằng "Thuộc tính PRIMARY KEY thường tạo ra một chỉ mục ĐỘC ĐÁO trên cột hoặc các cột được chỉ định là KHÓA CHÍNH". Tuy nhiên, chỉ mục đó không hiển thị trong các ứng dụng quản lý SQLite, đó là lý do tôi hỏi.
Marek Jedliński

1
Nó được đề cập trong sqlite_masterbảng với một tên bắt đầu bằng sqlite_autoindex_.
dan04

2
Muộn, nhưng @NicolasZozol có, bạn cần tạo một UNIQUEchỉ mục (hoặc một UNIQUEràng buộc) trên (các) trường cha / tham chiếu nếu nó không tồn tại; nó được khuyến cáo rằng đứa trẻ / tham khảo lĩnh vực (s) có một chỉ số (mà thường sẽ không là duy nhất): xem tại đây
TripeHound

2
Hmm, phần SQL Data Constraints ở đây cho biết: Trong hầu hết các trường hợp , các ràng buộc CHÍNH HÃNG và CHÍNH HÃNG được thực hiện bằng cách tạo một chỉ mục duy nhất trong cơ sở dữ liệu. (Các trường hợp ngoại lệ là KEY PRIMARY KEY và PRIMary KEY trên các bảng KHÔNG CÓ ROWID.). Vậy câu trả lời không phải lúc nào cũng đúng?
Sự tò mò tinh

3
Có vẻ như rowid IS được lập chỉ mục nhưng được triển khai khác nhau sqlite.org/lang_createtable.html#rowid Dữ liệu cho các bảng rowid được lưu trữ dưới dạng cấu trúc B-Tree chứa một mục nhập cho mỗi hàng của bảng, sử dụng giá trị rowid làm khóa ... Tìm kiếm đối với một bản ghi với một hàng cụ thể ... nhanh gấp khoảng hai lần so với tìm kiếm tương tự được thực hiện bằng cách chỉ định bất kỳ giá trị CHÍNH hoặc giá trị được lập chỉ mục nào khác.
matreshkin

15

Nếu một cột được đánh dấu KEY PRIMARY KEY, thì nó thực sự nhanh gấp hai lần so với một tìm kiếm tương tự được thực hiện bằng cách chỉ định bất kỳ KEY PRIMARY KEY hoặc giá trị được lập chỉ mục nào khác . Điều này là do:

... tất cả các hàng trong các bảng SQLite đều có khóa số nguyên có chữ ký 64 bit, xác định duy nhất hàng trong bảng của nó ... Tìm kiếm một bản ghi với một hàng cụ thể hoặc cho tất cả các bản ghi có hàng trong phạm vi được chỉ định là khoảng hai lần nhanh như một tìm kiếm tương tự được thực hiện bằng cách chỉ định bất kỳ giá trị CHÍNH hoặc giá trị được lập chỉ mục nào khác.

Với một ngoại lệ được ghi chú bên dưới, nếu một bảng rowid có khóa chính bao gồm một cột duy nhất và loại khai báo của cột đó là "INTEGER" trong bất kỳ hỗn hợp nào của chữ hoa và chữ thường, thì cột sẽ trở thành bí danh cho rowid.

Một cột như vậy thường được gọi là "khóa chính số nguyên". Cột KEY PRIMARY chỉ trở thành khóa chính số nguyên nếu tên loại khai báo chính xác là "INTEGER". Các tên loại số nguyên khác như "INT" hoặc "BIGINT" hoặc "SHORT INTEGER" hoặc "UNSIGNED INTEGER" làm cho cột khóa chính hoạt động như một cột bảng thông thường có ái lực nguyên và một chỉ mục duy nhất, không phải là bí danh cho hàng.

Xem: http://www.sqlite.org/lang_createtable.html#rowid


8

Một cơ sở dữ liệu sẽ luôn âm thầm tạo một chỉ mục cho một khóa chính duy nhất để nó có thể kiểm tra bên trong nó một cách hiệu quả.

Khi đã tạo ra nó, nó sẽ sử dụng nó khi cần thiết.

Tất nhiên, nó sẽ không luôn được phân cụm và bạn thường chỉ định trong lược đồ nếu bạn muốn nó được.

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.