sql >> Database >  >> RDS >> Mysql

MySQL-definiërende kolom als UNIEK met AUTO_INCREMENT in plaats van als primaire sleutel

MySQL definiëren zonder expliciete primaire sleutels is een heel erg slecht idee.
Als een PK ontbreekt, zal MySQL een impliciete (maar zeer reële) integer auto-incrementing primaire sleutel maken.
Deze PK zal worden opgenomen in elke secundaire sleutel in InnoDB en bepaalt uw primaire sorteervolgorde in MyISAM.

Gevolg
Je hebt zojuist de prestaties van elke selectie, invoeging en update vertraagd.
Voor geen enkel doeleinde.

InnoDB:extra opzoeken vereist om bij tabelgegevens te komen
In InnoDB moet een extra lookup worden gedaan, omdat alle secundaire indexen verwijzen naar de PK en niet naar de rijen zelf.

MijnISAM:verspilde ruimte
In MyISAM is de straf niet zo groot, maar je sleept nog steeds een ongebruikt veld van 4 bytes mee dat niet wordt gebruikt.

InnoDB + MyISAM:nutteloos genereren van autoincrement-veld
Omdat er een impliciete auto-incrementerende PK wordt gemaakt, en je ook een extra auto-incrementing-sleutel nodig had om joins te doen; Om dubbele auto-increment velden te voorkomen heb je nu niet 1, maar 2 table locks per insert.

InnoDB:met joins verdubbelt het bovengenoemde opzoekprobleem
Als je een join doet met een veld dat niet de PK is, moet InnoDB per join extra opzoeken om naar de records van die andere tafel te gaan.

InnoDB:in het ergste geval verliest u het voordeel van het afdekken van indexen
U hebt een van de beste optimalisaties in InnoDB, die indexen omvat, uitgeschakeld.
Als MySQL de query kan oplossen met alleen de gegevens in de indexen, zal het de tabel nooit lezen, dit zal resulteren in een aanzienlijke snelheid verdienen. Nu 50% van elke index in InnoDB ongebruikte ruimte is, heb je zojuist je kansen verkleind dat die optimalisatie wordt gebruikt.

Sla deze aannemer alsjeblieft met een aanwijzingsstok!

Links:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (trage link, maar lees het aan).
O'Reilly op de indexen van InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , als uw contractant zegt dat het niet veel uitmaakt omdat hij MyISAM gebruikt, versla hem opnieuw, u moet altijd InnoDB gebruiken, tenzij u een goede reden heeft dat ook niet.
InnoDB is veel veiliger in productie, MyISAM heeft zijn voordelen gebruikt, maar raakt te gemakkelijk beschadigd.



  1. MySQL INTO OUTFILE overschrijven bestaand bestand?

  2. mysql | Verzoek uit lege kolom en FIND_IN_SET

  3. Paragraaf tekst opslaan in mysql

  4. php:sessies versus database