sql >> Databasteknik >  >> RDS >> Mysql

MySQL definierar kolumn som UNIQUE med AUTO_INCREMENT istället för som primärnyckel

Definiera MySQL utan explicit primärnycklar är en väldigt dålig idé.
Om en PK saknas kommer MySQL att skapa en implicit (men väldigt verklig) heltals autoinkrementerande primärnyckel.
Denna PK kommer att inkluderas i varje sekundär nyckel i InnoDB och kommer att bestämma din primära sorteringsordning i MyISAM.

Konsekvens
Du har precis saktat ner prestandan för varje val, infogning och uppdatering.
För inget syfte.

InnoDB:extra uppslag krävs för att komma till tabelldata
I InnoDB behöver en extra uppslagning göras, eftersom alla sekundära index refererar till PK och inte till raderna själva.

MyISAM:bortkastat utrymme
I MyISAM är påföljden inte så stor, men du drar fortfarande med ett oanvänt fält på 4 byte som inte används.

InnoDB + MyISAM:Värdelös generering av autoinkrementfält
Eftersom en implicit autoinkrementerande PK skapas, och du behövde också en extra autoinkrementerande nyckel för att göra joins; För att förhindra dubbletter av autoinkrementfält har du nu inte 1, utan 2 tabelllås per infogning.

InnoDB:med kopplingar fördubblas uppslagsproblemet som nämns ovan
Om du gör en koppling med ett fält som inte är PK, måste InnoDB göra en extra sökning per koppling för att komma till posterna för det andra bordet.

InnoDB:värst av allt förlorar du fördelen med att täcka index
Du har inaktiverat en av de bästa optimeringarna i InnoDB, som täcker index.
Om MySQL kan lösa frågan med endast data i indexen kommer den aldrig att läsa tabellen, detta kommer att resultera i en betydande hastighet få. Nu när 50 % av varje index i InnoDB är oanvänt utrymme har du precis tagit bort dina chanser att den optimeringen används.

Snälla slå den här entreprenören med en ledtråd!

Länkar:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (långsam länk, men rekommenderar läsning).
O'Reilly på InnoDB:s täckande index http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , om din entreprenör säger, det spelar ingen större roll eftersom han använder MyISAM, slå honom igen, du bör alltid använda InnoDB om du inte har en bra anledning att inte också.
InnoDB är mycket mycket säkrare i produktionen, MyISAM har sin använder men blir för lätt skadad.



  1. Ignorera datumintervallsparametern i where-satsen när parametern inte anges

  2. Hur man får aktuellt Auto_Increment-sekvensnummer för MySQL / MariaDB-tabell

  3. Hur tar man bort accenter och alla tecken <> a..z i sql-server?

  4. Konvertera lokal TIME_STAMP till UTC-tid