sql >> Database >  >> RDS >> Mysql

MySQL-indexkardinaliteit - prestaties versus opslagefficiëntie

Hogere kardinaliteit betekent betere leesprestaties omdat er per definitie minder records moeten worden gelezen.

Om een ​​zoekopdracht als deze te verwerken:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, moet de engine de volgende stappen uitvoeren:

  1. Zoek het eerste item dat aan de voorwaarde voldoet.

    Dit wordt gedaan door de B-Tree , beginnend bij de root-invoer.

    Over de pagina's wordt gezocht door B-Tree . te volgen koppelingen; binnen een pagina wordt de zoekopdracht uitgevoerd met behulp van binaire zoekopdrachten (tenzij uw sleutels zijn gecomprimeerd, in welk geval het een lineaire zoekopdracht is).

    Dit algoritme heeft dezelfde efficiëntie voor kolommen met zowel hoge kardinaliteit als lage kardinaliteit. De eerste 3 vinden (in tegenstelling tot elke 3 ) in deze lijsten:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    vereist dezelfde O(log(n)) stappen.

  2. De index doorlopen totdat de sleutelwaarde verandert. Dit vereist natuurlijk lineaire tijd:hoe meer records je hebt, hoe meer je moet doorkruisen.

Als u alleen het eerste record nodig heeft:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, heeft de kolomkardinaliteit geen invloed op de leesprestaties.

Elke indexsleutel heeft een verborgen extra waarde:een recordpointer. Dit is het hele punt van het hebben van een index:je moet weten naar welk record het verwijst.

Omdat een recordaanwijzer per definitie uniek is, is elke indexsleutel ook uniek. De indexitems die dezelfde sleutelwaarde delen, worden gesorteerd op de recordaanwijzer.

Dit is om de index onderhoudbaar te maken:als u een record verwijdert met een waarde van een geïndexeerde kolom die wordt gedeeld door een miljoen andere records, moet het bijbehorende indexrecord ook worden verwijderd. Maar de hele miljoen indexrecords worden niet doorzocht:in plaats daarvan wordt de recordaanwijzer gebruikt als een extra zoekvoorwaarde.

Elke indexsleutel is in feite uniek (zelfs als u de index niet als uniek definieert) en heeft daarom een ​​maximale kardinaliteit.

Het antwoord op uw vragen is dus:nee, de kardinaliteit van de kolom heeft geen invloed op de schrijfprestaties van de index.




  1. Kan ik de ALTER-tabel ongedaan maken in - MySQL?

  2. mysql in xampp start en stopt in vijf seconden

  3. Ondersteunt transacties, vergrendeling op rijniveau en externe sleutels

  4. Hoe koppelt Wordpress berichten aan categorieën in zijn database?