Domanda

Ho un problema del database di interessante. Ho un DB che è 150GB in termini di dimensioni. Il mio buffer di memoria è da 8 GB.

La maggior parte dei miei dati è raramente essere recuperate, o prevalentemente di essere recuperate da processi di back-end. Mi piacerebbe molto preferiscono tenerli in giro perché alcune caratteristiche li richiedono.

Alcuni di essi (cioè alcuni tavoli, e alcune parti identificabili di alcune tabelle) sono usati molto spesso in maniera utente fronte

Come posso fare in modo che quest'ultimo sia sempre essere tenuti in memoria? (Non v'è più che sufficiente spazio per questi)

Più informazioni: Siamo su Ruby on Rails. Il database è MySQL, i nostri tavoli vengono memorizzate mediante INNODB. Stiamo sharding i dati attraverso 2 partizioni. Perché siamo sharding, abbiamo memorizzare la maggior parte dei nostri dati utilizzando blob JSON, mentre l'indicizzazione solo le chiavi primarie

Aggiorna 2 La cosa difficile è che i dati sono effettivamente utilizzato per entrambi i processi back-end così come le caratteristiche lato utente. Ma vi si accede molto meno spesso per quest'ultima

Aggiorna 3 Alcune persone sono commentando quanto 8Gb è un giocattolo in questi giorni. Sono d'accordo, ma solo l'aumento delle dimensioni del db è la pigrizia puro se c'è una più intelligente, soluzione efficiente

È stato utile?

Soluzione

Con MySQL, uso corretto del Query Cache non mancherà di tenere i dati spesso interrogati in memoria. È possibile fornire un suggerimento a MySQL di non memorizzare nella cache determinate query (per esempio dai processi di back-end) con la parola chiave SQL_NO_CACHE.

Se i processi di back-end accedono ai dati storici, o l'accesso ai dati per finalità di reporting, di certo seguire il suggerimento di S. Lott per creare un data warehouse separato e query che invece. Se un data warehouse è troppo da realizzare nel breve termine, è possibile replicare il database transazionale a un server diverso ed eseguire query lì (un Data Warehouse si dà molta più flessibilità e capacità, in modo da andare su questa strada se possibile)

UPDATE:

UPDATE 2:

Ho confermato con il supporto MySQL che non v'è alcun meccanismo per selettivamente alcune tabelle di cache ecc nel buffer pool InnoDB.

Altri suggerimenti

Questo è il motivo per cui abbiamo Data Warehouse. Separare le due cose in (a) database separati o (b) dello schema separato all'interno di un database.

  1. I dati che è in corso, per l'accesso immediato, in fase di aggiornamento.

  2. I dati che è fatto storico, per l'analisi, non è in fase di aggiornamento.

150Gb non è molto grande e un unico database in grado di gestire il vostro po 'di dati dal vivo e la tua grande po' di storia.

Usa un "periodica" processo di ETL per ottenere le cose di database attivo, denormalizzare in uno schema a stella e caricare nel data warehouse storici.

Se il numero di colonne utilizzate nel cliente di fronte a tavoli sono piccole si possono fare gli indici con tutte le colonne utilizzate nelle query. Ciò non significa che tutti i soggiorni di dati in memoria, ma può rendere le query molto più veloce. Il suo spazio di negoziazione per i tempi di risposta.

Ciò richiede memcached! Mi consiglia di utilizzare la cache-soldi, un grande ActiveRecord write-through libreria caching. Il ramo ngmoco ha il supporto per abilitare la memorizzazione nella cache per ogni modello, così da poter memorizzare nella cache solo quelle cose che si sapeva che voleva tenere in memoria.

Si potrebbe anche fare il caching a mano con $ cache.set / get / scadono chiamate in azioni di controllo o ganci modello.

Quindi, qual è il problema?

In primo luogo, 150 GB non è molto grande oggi. E 'stato 10 anni fa.

In secondo luogo qualsiasi sistema di database non-totale-merda utilizzerà la memoria come cache. Se la cache è abbastanza grande (rispetto alla quantità di dati che è in uso) sarà efficace. In caso contrario, l'unica cosa che puoi fare è ottenere più memoria (perché, scusate, 8GB di memoria è molto basso per un server moderno - era bassa 2 anni fa).

Non si dovrebbe avere a che fare qualsiasi cosa per la memoria da utilizzare in modo efficiente. Almeno non su un database di livello commerciale - forse mysql fa schifo, ma non vorrei assumere questo

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top