sql >> Databasteknik >  >> RDS >> Mysql

Slumpmässig PRIMÄRNYCKEL för Innodb

MySQL "bygger om" inte indexet på varje inlägg.

MySQL:s standardsidastorlek är 16K. Den allokerar dessa sidor i steg om 1 MB (kallas omfattningar).

När en tabell först skapas (indexen byggs om), fylls sidorna upp 15/16:e, vilket ger plats för några slumpmässiga inlägg (1k utrymme). Om dina indexposter är 500 byte vardera (primärnyckelstorlek + raddata för ett klustrat index), lämnar det utrymme för två nya rader som ska infogas innan sidan måste delas upp.

MySQL behåller värdet för den högsta och lägsta posten i sidhuvudet, så poster inom ett visst intervall hamnar på samma sida.

När MySQL behöver infoga en rad på en hel sida måste sidan delas. MySQL kommer att lägga till en ny sida och flytta hälften av siddata till den nya sidan.

På en sida kanske poster faktiskt inte är i fysisk ordning. De kommer att vara i den ordning de sattes in. De är länkade i ordning via en form av länkad lista. Så även en slumpmässig infogning, utanför behovet av att dela upp sidan, orsakar inte att data fysiskt flyttas runt.

Efter många slumpmässiga inlägg kommer dina sidor att vara från 1/2 fulla till fulla. Ett index med många halvhela sidor kommer att påverka läsprestandan negativt (du måste läsa två halvhela sidor för att läsa samma antal poster som en 15/16:e helsida).

Nu, om du infogar rader i indexordning, fortsätter MySQL helt enkelt att lägga till i slutet av sidorna, fylla dem 15/16 fulla och lägga till en omfattning i taget av sidor. Mycket mindre prestandastraff eftersom det inte finns någon uppdelning av sidor, därför är ingen överföring av data involverad, för att inte tala om fördelen med läsprestanda med nästan hela sidor.

Slumpmässiga inlägg ökar också fragmenteringen av sidorna, vilket kan påverka läsprestandan om du ofta läser ett stort antal sekventiella poster (sällsynt).

Även ändra buffring kan påverka dig.




  1. Hur man får kortdagens namn från ett datum i MariaDB

  2. Hur fixar man FEL:kolumnen c.relhasoids finns inte i Postgres?

  3. SQL Sub-frågor i kontrollbegränsning

  4. Android :SQLite-fel - (1) nära null:syntaxfel