Dovrei dare una premessa dicendo che sono principalmente uno sviluppatore web di front end, formato come musicista, ma negli ultimi anni ho sempre più sviluppato l'informatica.
Quindi un'idea che ho come divertente progetto di giocattolo per conoscere le strutture dati e la programmazione C è stata quella di progettare e implementare il mio database molto semplice che gestiva un elenco di post di adiacenze. Non voglio SQL (forse farò il mio linguaggio di query? Mi sto solo divertendo). Dovrebbe supportare l'ACID. Dovrebbe essere in grado di memorizzare 1 TB, diciamo.
Quindi, stavo cercando di pensare a come un database memorizza i dati, senza riguardo alle strutture dati necessariamente. Sto lavorando su linux e ho letto che in quel mondo "tutto è un file", incluso l'hardware (come /dev/*
), quindi penso che ovviamente debba applicarsi anche a un database, e chiaramente fa - sia che sia MySQL o PostgreSQL o Neo4j, il database stesso è una raccolta di file che puoi vedere nel filesystem.
Detto questo, ci sarebbe un punto in scala in cui il caricamento dell'intero database nella memoria primaria non funzionerebbe, quindi non ha senso progettarlo con quella mentalità (presumo). Tuttavia, la lettura dalla memoria secondaria sarebbe molto più lenta e indipendentemente da una parte del database deve essere nella memoria primaria per poter essere in grado di fare qualsiasi cosa con esso. Ho letto questo post:
Perché utilizzare un database invece di salvare i dati sul disco?
E ho trovato difficile capire come altri database, come SQLite o Neo4j, leggono e scrivono dalla memoria secondaria e sono ancora molto veloci (più veloce, sembrerebbe, piuttosto che scrivere semplicemente file sul filesystem come suggerisce la domanda precedente) . Sembra che la chiave sia l'indicizzazione. Ma anche gli indici devono essere memorizzati nella memoria secondaria. Sono intrinsecamente più piccoli del database stesso, ma anche gli indici di un database molto grande potrebbero essere troppo grandi.
Quindi la mia domanda è: in che modo l'I / O viene generalmente eseguito con database di grandi dimensioni come quello che ho descritto in precedenza, che sarebbe almeno di 1 TB contenente una grande lista di adiacenze? Se l'indicizzazione è più o meno la risposta, come funziona esattamente l'indicizzazione: quali strutture di dati dovrebbero essere coinvolte?