2010-04-05 27 views
8

Tôi luôn cố gắng để có một khóa nguyên nguyên trên bảng bất kể là gì. Nhưng bây giờ tôi đang đặt câu hỏi nếu điều này là luôn luôn cần thiết.chỉ mục văn bản so với chỉ số nguyên trong mysql

Giả sử tôi có một bảng sản phẩm và mỗi sản phẩm có số SKU duy nhất trên toàn cầu - đó sẽ là một chuỗi gồm 8-16 ký tự. Tại sao không làm cho PK này? Thông thường tôi sẽ làm cho trường này trở thành chỉ mục duy nhất nhưng sau đó có trường int gia tăng tự động là PK, vì tôi cho rằng nó sẽ nhanh hơn, dễ bảo trì hơn và cho phép tôi làm những việc như nhận được 5 bản ghi mới nhất được thêm dễ dàng. Tuy nhiên, về mặt tối ưu hóa, giả sử tôi chỉ muốn kết hợp trường văn bản đầy đủ và tiếp theo là các truy vấn đối sánh văn bản (ví dụ như %%), bạn có thể nghĩ ra bất kỳ lý do nào không sử dụng khóa chính dựa trên văn bản hay không, nhiều khả năng loại varchar()?

Chúc mừng, imanc

+0

có thể trùng lặp của http://stackoverflow.com/questions/63090/surrogate-vs-natural-business-keys – outis

Trả lời

6

Sử dụng số SKU làm khóa chính có ý nghĩa nào đó. Bạn sẽ muốn lập chỉ mục nó để tìm kiếm nhanh chóng bằng SKU. Và SKU là natural index.

Tuy nhiên nó có một số hình phạt:

  • Performance (như Coronatus nói)

  • Thiếu thiết kế linh hoạt. Nếu, vì bất kỳ lý do nào, SKU dừng lại là duy nhất trên toàn cầu, bạn sẽ bị buộc phải thay đổi không chỉ cấu trúc bảng mà còn tất cả các truy vấn của bạn.

  • Thay đổi SKU của một mục sẽ buộc bạn phải thay đổi tất cả các mối quan hệ trong cơ sở dữ liệu.

-2

Máy vi tính là MUCH nhanh tại so sánh con số hơn chuỗi.

Ngoài ra, chỉ mục chuỗi của MySQL chỉ chứa 4 chữ cái đầu tiên theo mặc định.

Nếu bạn có chuỗi blabfoo, blabbar, blabboo, chỉ mục sẽ hoàn toàn vô dụng vì 4 ký tự đầu tiên bằng nhau, do đó tìm kiếm "blabf" sẽ bắt đầu khớp với TẤT CẢ 3 chuỗi, sau đó lặp lại kết quả.

Về cơ bản, không bao giờ sử dụng chuỗi cho chỉ mục vì chúng chậm và sử dụng nhiều không gian hơn.

+5

Điều này chỉ đơn giản là không chính xác. Theo mặc định, MySQL sẽ lập chỉ mục toàn bộ chuỗi (trừ khi nó là một văn bản/blob, trong trường hợp này bạn phải chỉ định chiều dài) và truy xuất các hàng thông qua một cột chuỗi được lập chỉ mục rất nhanh. – grahamparks

+0

@grahamparks Nhận xét tuyệt vời nhưng nhanh như thế nào so với chỉ số nguyên? –

Các vấn đề liên quan