2008-10-02 57 views
6

Tôi cần một bảng đơn giản với tên người dùng và trường mật khẩu trong mySQL. Vì tên người dùng phải là duy nhất, điều đó có ý nghĩa với tôi để làm cho chúng trở thành khóa chính.CHAR() hoặc VARCHAR() làm khóa chính trong bảng mySQL ISAM?

Sử dụng CHAR() hoặc VARCHAR() làm khóa chính có tốt hơn không?

Trả lời

9

cũng có thể chỉ sử dụng chỉ mục ID người dùng, kết hợp nhanh hơn nhiều so với kết hợp với char/varchar. hai giây để thêm rằng bây giờ có thể giúp bạn tiết kiệm rất nhiều thời gian sau đó nếu bạn vô tình phải mở rộng chức năng của lược đồ của bạn.

một số cạm bẫy để suy nghĩ về:

  • nói rằng chúng ta thêm một vài bảng vào một ngày trong tương lai, những gì nếu ai đó muốn thay đổi tên người dùng?
  • nói rằng ứng dụng thành công hơn, chúng tôi nghĩ, và chúng tôi phải xem xét tối ưu hóa, bạn có thực sự muốn làm lại lược đồ của mình tại thời điểm này để giảm chi phí của chỉ mục varchar'ed không?
+0

Đồng ý, bạn có thể muốn một id người dùng cho một cái gì đó và nó nhỏ hơn rất nhiều so với việc lưu trữ tên người dùng trong bất kỳ bảng đã tham gia nào. –

0

Tôi không thấy CHAR được sử dụng nhiều trong bất kỳ cơ sở dữ liệu MySQL nào mà tôi đã làm việc. Tôi sẽ đi với VARCHAR

Ví dụ, toàn bộ 30 ký tự được lưu trữ trong bảng nghĩa là mọi mục nhập sẽ chiếm cùng một không gian, ngay cả khi tên người dùng của bạn chỉ dài 10 ký tự.

Sử dụng VARCHAR (30) nó sẽ chỉ sử dụng đủ dung lượng để lưu trữ chuỗi bạn đã nhập.

Trên một bảng nhỏ, nó sẽ không tạo ra nhiều khác biệt, nhưng trên một bảng lớn hơn, VARCHAR sẽ chứng minh để giữ cho nó nhỏ hơn tổng thể.

+1

Trong trường hợp này, tôi nghĩ CHAR có ý nghĩa hơn. Đó là một trường độ dài cố định. Nếu tất cả các trường trong bảng có độ dài cố định, truy vấn sẽ chạy nhanh hơn vì mysql không được tính toán nơi bắt đầu các bản ghi tiếp theo. Nowdays không gian là giá rẻ, tôi sẽ giao dịch một chút không gian ở đây cho tốc độ hơn. – DreamWerx

+0

chỉ xem ra các dấu cách trên CHAR khi khớp với chuỗi –

5

Tôi sẽ làm việc chăm chỉ để KHÔNG sử dụng CHAR() hoặc VARCHAR() làm PK nhưng sử dụng int với auto_increment thay thế. Điều này cho phép bạn sử dụng user_id đó trong các bảng con nếu cần và các truy vấn trên PK sẽ nhanh hơn. Nếu bạn phải sử dụng hoặc là một CHAR() hoặc VARCHAR(), tôi muốn đi với CHAR() vì nó là một chiều rộng cố định. Tôi không chắc chắn về cách MySQL xử lý VARCHAR() nhưng hầu hết các công cụ cơ sở dữ liệu phải thực hiện một số phép thuật dưới mui xe để giúp động cơ biết nơi các trường VARCHAR() kết thúc và nơi bắt đầu trường tiếp theo , một CHAR() làm cho nó thẳng về phía trước và giữ cho động cơ không phải suy nghĩ nhiều.

1

[Tôi sẽ làm việc chăm chỉ để không sử dụng CHAR() hoặc VARCHAR() như là một PK nhưng sử dụng một int với auto_increment để thay thế.] +1

Đặt một hạn chế duy nhất của tên người dùng nhưng sử dụng int trường là PK

+0

đây không phải là câu trả lời cho câu hỏi, đây là gợi ý và nó không giải quyết được nhiệm vụ –

+0

Tôi đoán điểm của tôi là câu hỏi đặt ra một giải pháp là phụ tối ưu, điểm của trang web này là để phổ biến tri thức. Nó cũng kỳ lạ rằng câu trả lời tương tự được đăng cùng một lúc đã không nhận được phiếu giảm giá. – RhysC

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