Oracle
s index är aldrig "obalanserade":varje blad i indexet är på samma djup som alla andra blad.
Ingen siddelning introducerar en ny nivå av sig själv:en bladsida blir inte en förälder för nya sidor som den skulle vara i ett icke-självbalanserande träd.
Istället görs ett syskon för den delade sidan och den nya posten (plus eventuellt några av posterna från den gamla sidan) går till den nya sidan. En pekare till den nya sidan läggs till för den överordnade.
Om den överordnade sidan har ont om utrymme också (kan inte acceptera pekaren till den nyskapade bladsidan), delas den också, och så vidare.
Dessa uppdelningar kan spridas upp till rotsidan, vars uppdelning är det enda som ökar indexdjupet (och gör det för alla sidor samtidigt).
Indexsidor är dessutom organiserade i dubbellänkade listor, varje lista på sin egen nivå. Detta skulle vara omöjligt om trädet var obalanserat.
Om master_id
är automatiskt inkrementerad, vilket betyder att alla delningar sker i slutet (så kallade 90/10
splits) vilket gör det mest täta indexet möjligt.
Nej, det skulle det inte, av skälen ovan.
Om du går med i slave
till master
ofta kan du överväga att skapa ett CLUSTER
av de två tabellerna, indexerade av master_id
. Detta innebär att posterna från båda tabellerna delar samma master_id
, gå till samma eller närliggande datasidor vilket gör en sammanfogning mellan dem mycket snabb.
När motorn hittade en post från master
, med ett index eller vad som helst, betyder detta också att den redan har hittat posterna från slave
förenas med den master
. Och vice versa, att hitta en slave
betyder också att lokalisera dess master
.