sql >> Databasteknik >  >> RDS >> Mysql

MySQL 5.0-index - Unik vs icke-unik

UNIQUE och PRIMARY KEY är begränsningar , inte index. Även om de flesta databaser implementerar dessa begränsningar genom att använda ett index. Den extra omkostnaden för begränsningen utöver indexet är obetydlig, särskilt när du räknar kostnaden för att spåra upp och korrigera oavsiktliga dubbletter när (inte om) de inträffar.

Index är vanligtvis effektivare om du har en hög selektivitet . Detta är förhållandet mellan antalet distinkta värden och det totala antalet rader.

Till exempel, i en kolumn för personnummer kan du ha 1 miljon rader med 1 miljon distinkta värden. Så selektiviteten är 1000000/1000000 =1,0 (även om det finns sällsynta historiska undantag, är SSN:er avsedda att vara unika).

Men en annan kolumn i den tabellen, "kön" kanske bara har två distinkta värden över 1 miljon rader. 2/1000000 =mycket låg selektivitet.

Ett index med en UNIK eller PRIMARY KEY-begränsning har garanterat en selektivitet på 1,0, så det kommer alltid att vara så effektivt som ett index kan vara.

Du frågade om skillnaden mellan en primärnyckel och en unik begränsning. Främst handlar det om att du bara kan ha en primärnyckelbegränsning per tabell (även om den begränsningens definition inkluderar flera kolumner), medan du kan ha flera unika begränsningar. En kolumn med en unik begränsning kan tillåta NULL, medan kolumner i primärnyckelbegränsningar inte får tillåta NULL. Annars är primärnyckel och unik mycket lika i sin implementering och användning.

Du frågade i en kommentar om du skulle använda MyISAM eller InnoDB. I MySQL använder de termen lagringsmotor . Det finns en massa subtila skillnader mellan dessa två lagringsmotorer, men de främsta är:

  • InnoDB stöder transaktioner, så du kan välja att återställa eller genomföra ändringar. MyISAM är i praktiken alltid autocommit.
  • InnoDB upprätthåller begränsningar för främmande nyckel. MyISAM tillämpar eller lagrar inte ens begränsningar för främmande nyckel.

Om dessa funktioner är saker du behöver i din applikation, bör du använda InnoDB.

För att svara på din kommentar är det inte så enkelt. InnoDB är faktiskt snabbare än MyISAM i ganska många fall, så det beror på din applikations mix av urval, uppdateringar, samtidiga frågor, index, buffertkonfiguration, etc.

Se http:/ /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ för en mycket noggrann prestandajämförelse av lagringsmotorerna. InnoDB vinner över MyISAM tillräckligt ofta för att det uppenbarligen inte går att säga att den ena är snabbare än den andra.

Som med de flesta prestationsrelaterade frågor är det enda sättet att svara på det för din ansökan är att testa båda konfigurationerna med din applikation och ett representativt urval av data, och mäta resultaten.



  1. Bra förebyggande av MYSQL-injektion?

  2. Använder MySQL-triggers

  3. Kör MySQL *.sql-filer i PHP

  4. 3 sätt att lista alla triggers för en given tabell i PostgreSQL