2015-10-10 21 views
5

Problema: abbiamo un tavolo molto grande e in crescita. La maggior parte delle voci (80% circa) sono dati storici (con il campo "data" passata la data corrente) che vengono interrogati raramente, mentre una piccola parte di esso (diciamo il 20%) sono dati correnti (campo "DATA" dopo la data corrente), la maggior parte delle query cerca queste voci correnti.Quanto deve essere grande la tabella MySQL prima di suddividerla in più tabelle?

considerare due possibili scenari, che si sarebbe meglio (considerando la difficoltà di attuazione e le prestazioni generali, ...)

  1. Rompere il grande tavolo in due tabella: i dati storici e attuali. E su base giornaliera sposto i record con data scaduta dalla tabella corrente alla tabella storica.

  2. Mantenere un record in una tabella (il campo DATI è definito come INDICE).

Lo scenario A indicherebbe più caos nella implementazione e manutenzione, e il sovraccarico su basi quotidiane per data tra le tabelle in movimento, mentre lo scenario B indicherebbe la ricerca di un grande database (anche se indicizzato). Imporre problemi di memoria? Quale scenario è raccomandato? C'è qualche altro consiglio?

+1

Dipende completamente dai dati, dall'hardware e dall'indicizzazione. Le tabelle con partizioni eccessive possono rallentare le prestazioni in determinati scenari (come i file aperti di piccole dimensioni consentiti, il numero limitato di tabelle aperte consentito), invece di aumentare le prestazioni.In generale una tabella ben normalizzata con> 100 GB di dati al suo interno, non dovrebbe essere un problema. –

+1

In base a ciò che è necessario fare con i dati archiviati in seguito, si potrebbe voler esaminare anche il motore di archiviazione ARCHIVE. http://dev.mysql.com/doc/refman/5.6/en/archive-storage-engine.html – CBroe

risposta

4

In genere non si desidera rompere un grande tavolo in più tabelle, anche se avere una tabella corrente e storica è assolutamente ragionevole. Il tuo processo ha un senso. È quindi possibile ottimizzare la tabella corrente per le esigenze della query. Probabilmente andrei su due tavoli (date le informazioni limitate fornite), perché consente tale ottimizzazione.

Tuttavia, non dividere i dati storici. Invece, usa il partizionamento. Vedi lo documentation. Un avvertimento: le query devono specificare la chiave di partizionamento nella clausola where per sfruttare le partizioni. Con un grande tavolo, questo è comunque tipico.

+0

Grazie a Gordon per la risposta. Quindi raccomandi l'approccio A. In questo caso, dovrei avere una operazione di manutenzione giornaliera e DB come: "controllare la tabella CURRENT, trovare i record con il campo DATA passato la data corrente e spostare quei campi nella tabella HISTORICAL". Questa operazione di manutenzione non comporterebbe un carico grave sul server? – cybergeek654

+0

Puoi spiegare cosa intendi con "Non dividere i dati storici". Perché dovrei? La mia domanda riguarda la suddivisione di tutti i miei dati in CORRENTE e STORICO. È questo che stai dicendo: adottando l'approccio B e partizionamento basato su DATE e quindi ri-partizionamento? – cybergeek654

+1

@ cybergeek654. . . Se volevi pensare a dividere i dati storici, non preoccuparti. Usa il partizionamento. Quando ho letto la domanda per la prima volta, ho pensato che potresti essere tentato di usare ancora più tabelle. –

2

Domanda: sono i dati storici necessari per la funzionalità del sistema o questi record sono archiviati per altri scopi (ad esempio audit)? Potrebbe essere il momento di pulire la casa spostando i dati storici in un archivio.

+0

No, i dati storici non vengono utilizzati per la funzionalità a livello di sistema. t – cybergeek654

+0

Se procedo con l'approccio A, i record storici sono record che hanno il campo DATE passato la data corrente, fanno una grande parte del database generale e pochissime query riguardano loro. – cybergeek654

2

Nella mia esperienza, la maggior parte dei sistemi con grandi dati ha tabelle storiche. Nella maggior parte dei casi che sono stato, sia i dati correnti che i dati storici hanno gruppi di utenti diversi. I dati attuali vengono utilizzati dagli utenti front-end per trattare con i clienti le loro transazioni correnti o recenti. I dati storici vengono solitamente utilizzati dai gruppi di utenti che non devono parlare direttamente con clienti/clienti.

Non preoccuparti molto del problema dell'implementazione e della manutenzione, perché penso che la tua considerazione principale riguardi le prestazioni. L'implementazione è solo un accordo occasionale che verrà eseguito su una frequenza specificata (come l'archivio settimanale, mensile o annuale) dopo aver spostato il/i programma/i in produzione. La manutenzione è molto piccola e puoi dimenticartene una volta che è già stata implementata. Devi solo assicurarti di testare accuratamente i programmi.

Per tabelle storiche normalizzate, le tabelle hanno la stessa struttura e nomi di campi che semplificano la copia dei dati. In questo modo, si può solo unire un tavolo tra i tavoli.

Se si sceglie di non dividere i dati, si continuerà ad aggiungere indice dopo indice. Ma da qualche parte lungo la strada, incontrerai ancora lo stesso problema.

+0

Grazie Eddie per la risposta. Nel mio caso, sia i dati correnti sia quelli storici possono essere consultati dagli stessi gruppi di utenti. Sebbene le query di dati cronologici effettuino una percentuale molto inferiore di query. – cybergeek654

+1

uno dei motivi per cui la maggior parte delle aziende che dispongono di set di dati di grandi dimensioni (come le dimensioni non sono più contate da record ma da gigabyte) dividono o archiviano i vecchi dati. la maggior parte dei vecchi dati non sono pertinenti con l'attuale attività quotidiana. tu e il tuo team dovrete identificare la frequenza o la rilevanza di tali dati storici su base giornaliera. Penso che tu e il tuo team dovreste fare una ricerca molto approfondita per convincere i gruppi di utenti e il management a disporre o meno di tabelle di archivio. –

Problemi correlati