Một vài điểm:
Có vẻ như bạn chỉ đang sử dụng những gì hiện tại là duy nhất của bảng và đặt nó làm khóa chính. Điều đó hoạt động. Và các khóa tự nhiên có một số lợi thế khi truy vấn vì tính cục bộ. (Dữ liệu của mỗi người dùng được lưu trữ trong cùng một khu vực). Và bởi vì bảng được nhóm lại bởi khóa đó, điều này sẽ loại bỏ các tra cứu dữ liệu nếu bạn đang tìm kiếm theo các cột trong chính.
-
Tuy nhiên, việc sử dụng khóa chính tự nhiên như bạn đã chọn cũng có những bất lợi cho hiệu suất.
-
Sử dụng một khóa chính rất lớn sẽ làm cho tất cả các chỉ mục khác rất lớn trong innodb vì khóa chính được bao gồm trong mỗi giá trị chỉ mục.
-
Sử dụng khóa chính tự nhiên không nhanh bằng khóa thay thế cho INSERT vì ngoài việc lớn hơn, nó không thể chỉ chèn vào cuối bảng mỗi lần. Nó phải chèn vào phần dành cho người dùng đó và bài đăng, v.v.
-
Ngoài ra, nếu bạn đang tìm kiếm theo thời gian thì rất có thể bạn sẽ tìm kiếm trên toàn bảng bằng một khóa tự nhiên trừ khi thời gian là cột đầu tiên của bạn. các khóa thay thế có xu hướng cục bộ theo thời gian và thường có thể phù hợp với một số truy vấn.
-
Sử dụng một khóa tự nhiên như khóa của bạn làm khóa chính cũng có thể gây khó chịu. Điều gì xảy ra nếu bạn muốn đề cập đến một cuộc bỏ phiếu cụ thể? Bạn cần một vài trường. Ngoài ra, nó hơi khó sử dụng với nhiều ORM.
Đây là câu trả lời
Tôi sẽ tạo khóa đại diện của riêng bạn và sử dụng nó làm khóa chính thay vì dựa vào khóa chính nội bộ của innodb vì bạn sẽ có thể sử dụng nó để cập nhật và tra cứu.
ALTER TABLE tbl_rate
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY(id);
Tuy nhiên, nếu bạn tạo khóa chính thay thế, tôi cũng sẽ đặt khóa của bạn là DUY NHẤT. Cùng một chi phí nhưng nó thực thi tính đúng đắn.
ALTER TABLE tbl_rate
ADD UNIQUE ( user_id, post_id, type );