Các khóa chính của ký tự và số nguyên


30

Tôi đang thiết kế một cơ sở dữ liệu với nhiều bảng tra cứu có chứa các thuộc tính có thể có của các thực thể chính. Tôi đang nghĩ đến việc sử dụng khóa 4 hoặc 5 ký tự để xác định các giá trị tra cứu này thay vì số nguyên tăng tự động để khi tôi lưu trữ các ID thuộc tính này trên các bảng chính, tôi sẽ thấy các giá trị có ý nghĩa thay vì chỉ là các số ngẫu nhiên.

Ý nghĩa hiệu suất của việc sử dụng trường ký tự làm khóa chính thay vì số nguyên là gì?

Tôi đang sử dụng MySQL nếu điều đó quan trọng.

[Chỉnh sửa]
Các bảng tra cứu này có các bản ghi mới được thêm vào không thường xuyên. Chúng được duy trì thủ công và các phím dựa trên ký tự cũng được tạo thủ công. Đây là một ví dụ:

      CUISINES
 ID      Description
-----  --------------
CHNSE  Chinese
ITALN  Italian
MXICN  Mexican

Câu trả lời:


22

Nó phụ thuộc vào động cơ của bạn. Sự khôn ngoan phổ biến là việc đọc rất rẻ, một vài byte ở đây và sẽ không ảnh hưởng đáng kể đến hiệu suất của cơ sở dữ liệu cỡ nhỏ đến trung bình.

Quan trọng hơn, nó phụ thuộc vào việc sử dụng mà bạn sẽ đặt khóa chính. Số nguyên serial có ưu điểm là đơn giản để sử dụng và thực hiện. Chúng cũng, tùy thuộc vào việc triển khai cụ thể của phương thức tuần tự hóa, có ưu điểm là có thể lấy được nhanh chóng , vì hầu hết các cơ sở dữ liệu chỉ lưu trữ số sê-ri ở một vị trí cố định, thay vì bắt Select max(ID)+1 from foođầu nhanh chóng.

Câu hỏi trở thành: làm thế nào một khóa 5 ký tự thể hiện một "giá trị có ý nghĩa" cho bạn và cho ứng dụng? Giá trị này được tạo như thế nào và mất nhiều thời gian hơn so với việc tìm số sê-ri tăng dần. Mặc dù có một lượng không gian nhỏ được lưu trong một số số nguyên, nhưng phần lớn các hệ thống sẽ bỏ qua khoản tiết kiệm không gian này.

Không có ý nghĩa về hiệu suất, lưu ý rằng sơ đồ nhân vật yêu cầu rằng không bao giờ có động cơ tự động, vì "phím" của bạn không thể sử dụng được. Đối với tên miền cụ thể của bạn, đừng bận tâm với các khóa nhân tạo và chỉ sử dụng tiếng Trung, tiếng Nhật và tiếng Thái làm tên khóa. Mặc dù bạn không thể đảm bảo tính duy nhất đối với bất kỳ ứng dụng nào có thể, nhưng trong phạm vi của bạn, việc sử dụng chúng thay vì viết tắt 5 ký tự khủng khiếp và bắt buộc sẽ hợp lý hơn nhiều. Không có tác động hiệu suất đáng kể cho đến khi bạn nhận được hàng triệu bộ dữ liệu.

Ngoài ra, nếu bạn chỉ theo dõi theo quốc gia xuất xứ và không phải các món ăn cụ thể trong khu vực (tiếng Quảng Đông, Tứ Xuyên, Sicilia, Umbrian, Calabrian, Yucatecan, Oaxacan, v.v.), bạn luôn có thể sử dụng mã ISO 3166 .

Nếu tôi có 10.000 công thức nấu ăn không phải là sự khác biệt giữa khóa 5 ký tự và 20 ký tự bắt đầu cộng lại?

Không gian rẻ . Khi bạn đang nói 10.000.000 công thức nấu ăn mà bạn đang thực hiện các thao tác OLAP, thì có lẽ. Với công thức 10k, bạn đang nhìn vào 150k không gian.

Nhưng một lần nữa, nó phụ thuộc. Nếu bạn có nhiều triệu bản ghi và đang tham gia vào chúng, thì sẽ hợp lý hóa việc tìm kiếm thứ gì đó tầm thường này (thành một cái nhìn cụ thể hóa). Đối với tất cả các mục đích thực tế, hiệu quả nối tương đối trên một máy hiện đại giữa khóa 5 ký tự và khóa có độ dài thay đổi rất giống nhau. Hạnh phúc thay, chúng ta sống trong một thế giới CPU phong phú và đĩa dồi dào. Những người khó chịu là quá nhiều tham gia và truy vấn không hiệu quả, thay vì so sánh từng nhân vật. Với mà nói, luôn luôn kiểm tra .

Những thứ P & T ở cấp độ này phụ thuộc vào cơ sở dữ liệu đến mức việc khái quát hóa là vô cùng khó khăn. Xây dựng hai mô hình mẫu của cơ sở dữ liệu, điền vào chúng với số lượng bản ghi ước tính, sau đó xem cái nào nhanh hơn. Theo kinh nghiệm của tôi, độ dài ký tự không tạo ra sự khác biệt lớn so với các chỉ mục tốt, cấu hình bộ nhớ tốt và các yếu tố điều chỉnh hiệu suất quan trọng khác.


@ BrianBallsun-Stanton nếu bạn có bất kỳ dữ liệu tuần tự cồng kềnh nào liên quan đến các bảng tra cứu này, dung lượng lưu trữ không rẻ (về tốc độ truy vấn) vì tốc độ đọc đĩa là nút cổ chai trong bất kỳ RDB nào không thể được lưu trữ hoàn toàn trong RAM. Tôi đã tìm thấy điều này trong khi cố gắng phát triển một lược đồ RDB có thể cạnh tranh với công việc DB tốt nhất trong chuỗi thời gian Tiết lộ đầy đủ, tôi không có mối quan hệ nào với Skyspark, ngoại trừ việc họ tính phí cho chủ nhân của tôi rất nhiều vì sử dụng DB rất hiệu quả của họ.
hobs

8

Tôi nghĩ rằng, không có vấn đề với hiệu suất cho bảng hiếm khi thay đổi. Có thể bạn sẽ gặp vấn đề với thiết kế trong tương lai. Tôi đề nghị bạn không nên sử dụng dữ liệu kinh doanh làm khóa chính vì những thay đổi trong kinh doanh. Sử dụng bất kỳ khóa chính bổ sung nào để "liên kết" các bảng trong mô hình của bạn. Mọi thay đổi kinh doanh sẽ KHÔNG ảnh hưởng đến liên quan đến một bảng này.


3

Câu hỏi thực sự là liệu hiệu năng truy vấn DB có đáng kể đối với ứng dụng của bạn không (kích thước dữ liệu). Nếu truy vấn của bạn mất vài giây, việc lưu một vài trong số những giây đó bằng cách sử dụng Intcác khóa không đáng bị phạt về khả năng đọc / bảo trì. Tuy nhiên, nếu truy vấn của bạn mất vài phút, thì việc lưu một số phút đó có thể là giá trị của Intcác phím.

Dưới đây là lý do tại sao tôi nghĩ rằng số nguyên có thể giúp bạn tiết kiệm thời gian truy vấn (tính theo phần trăm thời gian truy vấn tổng thể của bạn), nhưng những người sáng lập SkySpark có thể giải thích điều đó tốt hơn tôi . Tiết lộ đầy đủ, chủ nhân của tôi trả cho SkySpark rất nhiều tiền để sử dụng DB của họ và tôi đang cố gắng xây dựng một cái gì đó tốt hơn / nhanh hơn.

Nếu bạn có nhiều dữ liệu tuần tự (tệp nhật ký, chuỗi thời gian, phân tích, văn bản hoặc văn bản lời nói) có liên kết (mối quan hệ) với bất kỳ bảng tra cứu nào của bạn, bạn sẽ thấy rằng không gian lưu trữ rất quan trọng đối với tốc độ truy vấn, mặc dù @ Phân tích chính xác của Ballsun-Stanton về mức giá của không gian bằng $. Bởi vì hầu hết thời gian truy vấn (đối với dữ liệu tuần tự) được dành để đọc đĩa, không gian không tốn kém về mặt thời gian (tính theo phần trăm của tổng thời gian truy vấn). Vì vậy, trừ khi RDB của bạn tự động nén và giải nén hiệu quả tất cả các khóa ngoại (khóa cho các bản ghi liên quan), bạn sẽ muốn tất cả các khóa của mình trở nên Inthiệu quả nhất về không gian đĩa (và tốc độ đọc) trên mỗi đơn vị thông tin nội dung (entropy). MyIAM FYI trong MySql đặt ra các hạn chếvề những gì bạn có thể làm với các hàng dữ liệu nén (chỉ đọc). Nói cách khác, các số nguyên tăng tự động đã được nén càng nhiều càng tốt về mặt lý thuyết , với giới hạn kích thước tối thiểu thấp trên hầu hết các trường số nguyên DB. Và nén đó không có:

  1. hình phạt nén / giải nén thời gian truy vấn
  2. đĩa thời gian truy vấn đọc hình phạt
  3. chỉ đọc hoặc các hạn chế DB khác đối với các bản ghi hoặc khóa dữ liệu nén

Có một lý do tại sao các ORM phổ biến, hiệu quả như Django mặc định tự động tăng số nguyên cho PK và tại sao các câu hỏi SO khác lại đưa ra kết luận tương tự.

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.