Några punkter:
Det låter som att du bara använder det som för närvarande är unikt med tabellen och gör det som en primärnyckel. Det fungerar. Och naturliga nycklar har vissa fördelar när det gäller att fråga på grund av lokalitet. (Data för varje användare lagras i samma område). Och eftersom tabellen är klustrad av den nyckeln som eliminerar uppslagningar till data om du söker efter kolumnerna i den primära.
-
Men att använda en naturlig primärnyckel som du valde har också nackdelar för prestanda.
-
Att använda en mycket stor primärnyckel kommer att göra alla andra index mycket stora i innodb eftersom primärnyckeln ingår i varje indexvärde.
-
Att använda en naturlig primärnyckel är inte lika snabbt som en surrogatnyckel för INSERT eftersom den förutom att vara större inte bara kan infogas i slutet av tabellen varje gång. Den måste infogas i sektionen för den användaren och inlägg etc.
-
Dessutom, om du söker efter tid kommer du troligen att söka över hela tabellen med en naturlig nyckel om inte tid är din första kolumn. surrogatnycklar tenderar att vara lokala för tid och kan ofta vara precis rätt för vissa frågor.
-
Att använda en naturlig nyckel som din som en primärnyckel kan också vara irriterande. Vad händer om du vill hänvisa till en viss röst? Du behöver några fält. Det är också lite svårt att använda med många ORM.
Här är svaret
Jag skulle skapa din egen surrogatnyckel och använda den som en primärnyckel istället för att lita på innodbs interna primärnyckel eftersom du kommer att kunna använda den för uppdateringar och uppslagningar.
ALTER TABLE tbl_rate
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY(id);
Men om du skapar en primärnyckel som surrogat, skulle jag också göra din nyckel till en UNIK. Samma kostnad men det framtvingar korrekthet.
ALTER TABLE tbl_rate
ADD UNIQUE ( user_id, post_id, type );