12

Một câu hỏi:chìa khóa tự nhiên vs phím thay thế một InnoDB nước ngoài chủ chốt

Tôi có 2 bảng:

Product 
id INT 
name VARCHAR(64) 
something TEXT 
else INT 
entirely BOOL 

Ingredient 
id INT 
name VARCHAR(64) 
description TEXT 

Bây giờ tôi cũng có một bảng liên kết

Products_Ingredients 
product_id INT 
ingredient_id INT 

cho mối quan hệ nhiều đến nhiều của tôi .

Bây giờ cả hai sản phẩm và thành phần sẽ có tên duy nhất. Vì vậy, tôi có thể sử dụng tên là chìa khóa tự nhiên ... tuy nhiên đó sẽ là một ý tưởng tốt?

Nói rằng tôi có một sản phẩm: Paint Thinner Supreme với thành phần: Butylonitrotetrocycline

rằng sẽ là một ý tưởng tốt để sử dụng những cái tên như chính tổng hợp trong bảng liên kết? Khi tôi hiểu ý tưởng đằng sau việc sử dụng các khóa tự nhiên trên người thay thế, tôi không thể ngừng nghĩ rằng việc sử dụng các số nguyên đơn giản làm khóa chính (và các số nguyên) sẽ nhanh hơn nhiều. Sẽ có một sự khác biệt trong một cách mà máy chủ MySQL tiêu hóa các phím khác nhau?

Ý kiến ​​của bạn là gì?

Trả lời

16

Ý kiến ​​không có vấn đề khi bạn có thể đo lường.

Tôi đã triển khai điều này trên PostgreSQL bằng cả khóa tự nhiên và người thay thế. Tôi đã sử dụng 300.000 tổng sản phẩm, 180 thành phần và hai bảng "thành phần sản phẩm" có từ 3 đến 17 thành phần cho mỗi sản phẩm, cho 100.000 sản phẩm được chọn ngẫu nhiên (1053462 hàng).

Chọn tất cả các thành phần cho một sản phẩm sử dụng các khóa tự nhiên được trả lại trong 0,067 mili giây. Sử dụng thay thế, 0.199 mili giây.

Trả lại tất cả các cột không phải id cho một sản phẩm bằng cách sử dụng các khóa tự nhiên được trả về trong 0,45 ms. Sử dụng người thay thế, 0.222 ms

Vì vậy, các khóa tự nhiên nhanh hơn khoảng 2 đến 3 lần trên tập dữ liệu này.

Khóa tự nhiên không yêu cầu bất kỳ kết nối nào để trả lại dữ liệu này. Các khóa thay thế yêu cầu hai kết nối.

Sự khác biệt hiệu suất thực tế phụ thuộc vào chiều rộng của bảng, số hàng, kích thước trang và độ dài của tên và những thứ tương tự. Sẽ có một điểm mà các phím thay thế bắt đầu tốt hơn các phím tự nhiên, nhưng ít người cố gắng đo lường điều đó.

Khi tôi thiết kế cơ sở dữ liệu cho cơ sở dữ liệu hoạt động của nhà tuyển dụng, tôi đã xây dựng một testbed với các bảng được thiết kế quanh các khóa tự nhiên và với các bảng được thiết kế xung quanh số id. Cả hai lược đồ này đều có hơn 13 triệu hàng dữ liệu mẫu do máy tính tạo ra. Trong một vài trường hợp, các truy vấn trên lược đồ số id đã vượt trội hơn lược đồ khóa tự nhiên 50%. (Vì vậy, một truy vấn phức tạp mất 20 giây với số id mất 30 giây với các khóa tự nhiên.) Nhưng 80% truy vấn thử nghiệm có hiệu suất SELECT nhanh hơn so với lược đồ khóa tự nhiên. Và đôi khi nó nhanh hơn đáng kinh ngạc - sự khác biệt từ 30 đến 1.

Chúng tôi hy vọng các khóa tự nhiên sẽ hoạt động tốt hơn trong cơ sở dữ liệu của chúng tôi trong nhiều năm tới. (Trừ khi chúng tôi chuyển các bảng nhất định sang ổ SSD, trong trường hợp này, các khóa tự nhiên có thể sẽ hoạt động tốt hơn mãi mãi.)

+0

Lời giải thích hay, cảm ơn bạn. – RandomWhiteTrash

3

Đối với trường hợp này tôi muốn prefere phím thay thế vì

  1. tên của một sản phẩm hoặc một thành phần có thể thay đổi, đặc biệt là nếu nội dung của bạn được người dùng tạo ra (ví dụ như lỗi chính tả hay có một số tên có thể cho một mục)
  2. phím tự nhiên của bạn sẽ được lâu hơn nhiều so với và do đó sẽ ít hiệu quả
+0

+1 để chuyển sự chú ý sang tên có thể thay đổi/lỗi chính tả. Điểm tốt. – RandomWhiteTrash

+2

Ah, nhưng đó là những gì cập nhật xếp tầng là cho: đổi tên của các phím tự nhiên nước ngoài tự động. – RsrchBoy

+0

Điểm tốt RarchBoy, hy vọng khóa không liên quan đến quá nhiều dữ liệu. – fabspro

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