Efter tre måneders udvikling blev biblioteket libmdbx 0.10.0 (MDBX) frigivet med en implementering af en højtydende, kompakt indlejret nøgle-værdi-database. Koden til libmdbx distribueres under OpenLDAP Public License. libmdbx er en omfattende omarbejdning af DBMS LMDB og ifølge udviklerne overgår dets forfader i pålidelighed, funktionalitet og ydeevne. Det påstås, at libmdbx er op til 20% hurtigere end LMDB i CRUD-scenarier og op til 30% hurtigere, hvis man deaktiverer intern kontrol ved kompileringen af libmdbx, så det bliver sammenligneligt med LMDB-niveauet.
Libmdbx tilbyder ACID, streng serialisering af ændringer og ikke-blokerende læsning med lineær skalering på CPU-kerner. I libmdbx lægges der stor vægt på kodekvalitet, stabil drift af API, testning og automatiserede kontroller. Automatisk kompaktificering, automatisk håndtering af databasestørrelse, et enkelt databaseformat til 32-bit og 64-bit versioner samt vurdering af prøvestørrelser efter intervaller (range query estimation) understøttes. Dertil kommer et værktøj til kontrol af databasedens integritet med nogle genopretningsmuligheder. Siden 2016 er projektet blevet finansieret af Positive Technologies og siden 2017 har det været anvendt i deres produkter, og de sanktioner, som den amerikanske regering har indført mod Positive Technologies, har ikke haft nogen mærkbar indflydelse.
De vigtigste nye funktioner, forbedringer og rettelser, der er tilføjet siden den foregående udgivelse:
- Bindings til Ruby fra Mahlon E. Smith er tilgængelige, sammen med en prøversion af bindinger til Python fra Noel Kuntze, og bindingerne til GoLang fra Alexey Sharov er blevet opdateret.
- For "MDBX_WRITEMAP"-tilstand, hvor databasen ændres direkte i RAM, er der implementeret en "gennemsigtig spild" til disk for de ændrede databaser. Nu, efter hver operation er afsluttet, er sådanne sider straks klar til at blive skrevet til disk, og OS-kernen kan selvstændigt gemme de ændrede sider, og transaction fixation vil ikke kræve deres modificering. Som et resultat kan diskoperationerne i belastede scenarier med utilstrækkelig RAM reduceres med op til 2 gange.
- Implementeret erstatning af længe ubrugte skyggekopier af ændrede sider, med præference for at fjerne sider med store/lange værdier, der i langt de fleste scenarier kun ændres én gang pr. transaktion. Som følge heraf reduceres diskudvekslingen, og ydeevnen øges i scenarier med meget store transaktioner.
- Implementeret er den "smarte" sideopdelingsfunktion ved indsættelse af nøgler. Nu sikres der automatisk fuld udfyldning af sider ved indsættelse af ordnede sekvenser, og i andre tilfælde en mere optimal balancering af træet. Som resultat fyldes database-siderne i gennemsnit mere optimalt, og B-tree bliver mere afbalanceret, hvilket har en positiv indvirkning på ydeevnen.
- Der er tilføjet statistik over sidetransaktioner, hvilket muliggør en præcis vurdering af omkostningerne ved modifierende operationer i databasen.
- Over ti mindre fejl og problemer er blevet rettet, herunder: problemer med bygning via MinGW, brugen af `std::filesystem::path` i iOS <= 13.0, bygning målrettet mod ældre versioner af Windows osv.
- I alt er der foretaget mere end 200 ændringer i 66 filer, tilføjet ca. 6500 linjer, fjernet ca. 4500.
Det skal nævnes, at projektet Turbo-Geth (turbo-fork af Go-Ethereum) har valgt libmdbx som ny backend til lagring, og takker projektteamet (især Alexey Sharov, Artem Vorotnikov og Alexey Akhunov) for stor hjælp til testning under ekstreme brugsscenarier. Herunder blev en fejl i håndtering af forudsigende læsning/cache identificeret og rettet, hvilket førte til nedgang i ydeevnen i komplekst reproducerbare scenarier med store databaser.
Kilde: opennet.ru
