UNIEK en PRIMAIRE SLEUTEL zijn beperkingen , geen indexen. Hoewel de meeste databases deze beperkingen implementeren met behulp van een index. De extra overhead van de beperking naast de index is onbeduidend, vooral als je de kosten meet van het opsporen en corrigeren van onbedoelde duplicaten wanneer (niet als) ze zich voordoen.
Indexen zijn meestal effectiever als je een hoge selectiviteit hebt . Dit is de verhouding tussen het aantal verschillende waarden en het totale aantal rijen.
In een kolom voor burgerservicenummer heeft u bijvoorbeeld mogelijk 1 miljoen rijen met 1 miljoen verschillende waarden. De selectiviteit is dus 1000000/1000000 =1,0 (hoewel er zeldzame historische uitzonderingen zijn, zijn SSN's bedoeld om uniek te zijn).
Maar een andere kolom in die tabel, 'geslacht', heeft mogelijk maar twee verschillende waarden over 1 miljoen rijen. 2/1000000 =zeer lage selectiviteit.
Een index met een UNIEKE of PRIMARY KEY-beperking heeft gegarandeerd een selectiviteit van 1,0, dus hij zal altijd zo effectief zijn als een index kan zijn.
U vroeg naar het verschil tussen een primaire sleutel en een unieke beperking. Het is vooral zo dat u slechts één primaire sleutelbeperking per tabel kunt hebben (zelfs als de definitie van die beperking meerdere kolommen bevat), terwijl u meerdere unieke beperkingen kunt hebben. Een kolom met een unieke beperking kan NULL's toestaan, terwijl kolommen met primaire sleutelbeperkingen geen NULL's mogen toestaan. Anders lijken de primaire sleutel en uniek erg op elkaar in hun implementatie en gebruik.
U vroeg in een opmerking of u MyISAM of InnoDB wilt gebruiken. In MySQL gebruiken ze de term storage engine . Er zijn een heleboel subtiele verschillen tussen deze twee opslagengines, maar de belangrijkste zijn:
- InnoDB ondersteunt transacties, dus u kunt ervoor kiezen om wijzigingen terug te draaien of door te voeren. MyISAM is in feite altijd autocommit.
- InnoDB handhaaft beperkingen voor externe sleutels. MyISAM handhaaft geen beperkingen voor externe sleutels en slaat deze zelfs niet op.
Als deze functies dingen zijn die je nodig hebt in je applicatie, dan moet je InnoDB gebruiken.
Reageren op uw opmerking is niet zo eenvoudig. InnoDB is in nogal wat gevallen zelfs sneller dan MyISAM, dus het hangt af van de combinatie van selecties, updates, gelijktijdige query's, indexen, bufferconfiguratie, enz. in uw toepassing.
Zie http:/ /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ voor een zeer grondige prestatievergelijking van de storage-engines. InnoDB wint vaak genoeg van MyISAM dat het duidelijk niet mogelijk is om te zeggen dat de ene sneller is dan de andere.
Zoals met de meeste prestatiegerelateerde vragen, is de enige manier om deze voor uw toepassing te beantwoorden is om beide configuraties te testen met uw applicatie en een representatieve steekproef van gegevens, en de resultaten te meten.