13 aprile 2005

Transazioni e multiprocessing

Dovete installare e configurare un database di dimensioni medio-grandi per un nuovo progetto.
Avete a disposizione una nuova e bellissima macchina multiprocessore dell'ultima generazione, con tanta RAM e componenti di qualità.
Provate con mysql, caricando un database di test e cominciando a fare prove su come il db si dovrebbe trovare ad operare in produzione.
Mysql, come tutte le applicazioni multithread, fa partire un thread per ogni connessione, che gestisce interamente tutte le query effettuate su quella connessione.
Quindi, direte voi, se ho otto processori riuscirò in modo efficiente a sfruttarne almeno sette (lasciamone uno per i processi di sistema, tra cui l'I/O dei dischi).
Ebbene, se aprite 7 connessioni al server e fate 7 query anche molto impegnative per ogni connessione, vedrete che magicamente potrete avere i risultati in 1/7 del tempo. Ma attenzione: in mysql non esistono le transazioni. Ciò ha un'importante implicazione: tutte le tabelle che coinvolgo in una query devono presentare gli stessi dati anche per tutte le altre sessioni che le utilizzano, sia quelle che le leggono solamente, tanto più quelle che cercano di aggiornarle (che non possono aggiornarle, non essendoci una transazione separata). Da ciò deriva che, per tutta la durata di una query, le altre connessioni, che cercano anche solo di leggere da una delle tabelle coinvolte nella prima query, saranno completamente bloccate.
La vostra bella macchina multiprocessore starà quindi tutto il tempo ad aspettare il risultato della prima query, che comunque occupa solo un processore, quindi solo 1/8 della potenza disponibile.

Nessun commento: