sql >> Databasteknik >  >> RDS >> Mysql

MySQL:kolumner med låg kardinalitet/selektivitet =hur indexerar man?

Indexet som du beskriver är ganska meningslöst. Ett index används bäst när du behöver välja en liten antal rader i jämförelse med det totala antalet rader.

Anledningen till detta är relaterad till hur en databas kommer åt en tabell. Tabeller kan bedömas antingen genom en fullständig tabellskanning, där varje block läses och bearbetas i tur och ordning. Eller genom en rad- eller nyckelsökning, där databasen har en nyckel/rad och läser den exakta raden den kräver.

I det fall du använder en where-sats baserad på primärnyckeln eller ett annat unikt index, t.ex. where id = 1 , kan databasen använda indexet för att få en exakt referens till var radens data lagras. Detta är helt klart effektivare än att göra en fullständig tabellskanning och bearbeta varje block.

Nu tillbaka till ditt exempel, du har en where-sats av where status = 'enabled' , kommer indexet att returnera 150 m rader och databasen måste läsa varje rad i tur och ordning med separata små läsningar. Medan tillgång till tabellen med en fullständig tabellsökning gör att databasen kan använda sig av mer effektiva större läsningar.

Det finns en punkt där det är bättre att bara göra en hel tabell genomsökning istället för att använda indexet. Med mysql kan du använda FORCE INDEX (idx_name) som en del av din fråga för att tillåta jämförelser mellan varje tabellåtkomstmetod.

Referens:http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html



  1. Erlang emysql iPhone Emoji-kodningsproblem

  2. Dela funktion i oracle till kommaseparerade värden med automatisk sekvens

  3. Effektiv extern tjänstgöring med MySQL och ejabberd

  4. Hur man distribuerar PostgreSQL för hög tillgänglighet