sql >> Database teknologi >  >> RDS >> Mysql

MySQL definerer kolonne som UNIQUE med AUTO_INCREMENT i stedet for som Primary Key

Definere MySQL uden eksplicit primære nøgler er en meget, meget dårlig idé.
Hvis en PK mangler, vil MySQL skabe en implicit (men meget reel) heltal autoinkrementerende primærnøgle.
Denne PK vil blive inkluderet i hver sekundær nøgle i InnoDB og bestemmer din primære sorteringsrækkefølge i MyISAM.

Konsekvens
Du har lige sænket ydeevnen for hver valg, indsættelse og opdatering.
Uden noget formål.

InnoDB:ekstra opslag påkrævet for at komme til tabeldata
I InnoDB skal der laves et ekstra opslag, fordi alle sekundære indekser refererer til PK'en og ikke til selve rækkerne.

MyISAM:spildt plads
I MyISAM er straffen ikke så stor, men du trækker stadig med et 4 byte ubrugt felt, der ikke bliver brugt.

InnoDB + MyISAM:Ubrugelig generering af autoincrement-felt
Fordi en implicit autoincrementing PK bliver oprettet, og du også havde brug for en ekstra autoincrementing nøgle for at lave joins; For at forhindre duplikerede autoincrement-felter har du nu ikke 1, men 2 tabellåse pr. indsætning.

InnoDB:med joinforbindelser fordobles opslagsproblemet nævnt ovenfor
Hvis du laver en joinforbindelse ved hjælp af et felt, der ikke er PK'en, skal InnoDB lave et ekstra opslag pr. join for at komme til optegnelserne for den anden tabel.

InnoDB:værst af alt mister du fordelen ved at dække indekser
Du har deaktiveret en af ​​de bedste optimeringer i InnoDB, der dækker indekser.
Hvis MySQL kan løse forespørgslen ved kun at bruge dataene i indekserne, vil den aldrig læse tabellen, dette vil resultere i en betydelig hastighed gevinst. Nu hvor 50 % af hvert indeks i InnoDB er ubrugt plads, har du lige fjernet dine chancer for, at den optimering bliver brugt.

Vær venlig at slå denne entreprenør med en ledetråd!

Links:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (langsomt link, men anbefaler at læse).
O'Reilly på InnoDB's dækkende indekser http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , hvis din entreprenør siger, det betyder ikke meget, fordi han bruger MyISAM, slå ham igen, du bør altid bruge InnoDB, medmindre du også har en god grund til at lade være.
InnoDB er meget meget mere sikker i produktionen, MyISAM har sin bruger, men bliver for let ødelagt.



  1. MySQL-fejl 1064 ved tilføjelse af fremmednøgle med MySQL Workbench

  2. MySQL-pakke til python 3.7

  3. MySQL-gruppering med et kommasepareret felt

  4. Sådan forbinder du resultater af 2 tabeller baseret på ikke-betingelse