sql >> Database >  >> RDS >> Mysql

Mysql-tabel met samengestelde index maar geen primaire sleutel

Een paar punten:

Het klinkt alsof je gewoon gebruikt wat momenteel uniek is aan de tafel en dat als een primaire sleutel maakt. Dat werkt. En natuurlijke sleutels hebben enkele voordelen als het gaat om query's vanwege de plaats. (De gegevens voor elke gebruiker worden in hetzelfde gebied opgeslagen). En omdat de tabel is geclusterd door die sleutel, waardoor opzoekingen naar de gegevens worden geëlimineerd als u zoekt op de kolommen in de primaire.

  1. Maar het gebruik van een natuurlijke primaire sleutel zoals u heeft gekozen, heeft ook nadelen voor de prestaties.

  2. Het gebruik van een zeer grote primaire sleutel maakt alle andere indexen erg groot in innodb omdat de primaire sleutel in elke indexwaarde is opgenomen.

  3. Het gebruik van een natuurlijke primaire sleutel is niet zo snel als een surrogaatsleutel voor INSERT's, omdat deze niet alleen groter is, maar ook niet elke keer aan het einde van de tabel kan worden ingevoegd. Het moet in de sectie voor die gebruiker en post enz. worden ingevoegd.

  4. Als u op tijd zoekt, zoekt u hoogstwaarschijnlijk de hele tabel met een natuurlijke sleutel, tenzij tijd uw eerste kolom is. surrogaatsleutels zijn meestal lokaal voor de tijd en kunnen vaak precies goed zijn voor sommige vragen.

  5. Het gebruik van een natuurlijke sleutel zoals die van u als primaire sleutel kan ook vervelend zijn. Wat als u naar een bepaalde stemming wilt verwijzen? Je hebt een paar velden nodig. Het is ook een beetje moeilijk te gebruiken met veel ORM's.

Hier is het antwoord

Ik zou je eigen surrogaatsleutel maken en deze als primaire sleutel gebruiken in plaats van te vertrouwen op de interne primaire sleutel van innodb, omdat je deze kunt gebruiken voor updates en opzoekacties.

ALTER TABLE tbl_rate 
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
ADD PRIMARY KEY(id);

Maar als u een surrogaat-primaire sleutel maakt, zou ik uw sleutel ook UNIEK maken. Dezelfde kosten, maar het dwingt juistheid af.

ALTER TABLE tbl_rate 
ADD UNIQUE ( user_id, post_id, type );


  1. sqlplus hoe details van de momenteel verbonden databasesessie te vinden

  2. Hoe hernoem ik een MySQL-schema?

  3. Kan geen Chinees karakter invoegen in MySQL

  4. Optimalisatiedrempels - Gegevens groeperen en aggregeren, deel 3