2009-03-02 22 views
6

Sto lavorando a un progetto di natura simile all'analisi dei visitatori del sito web. Verrà utilizzato da centinaia di siti Web con una media di 10.000 a 100.000 visualizzazioni di pagina al giorno, pertanto l'importo dei dati sarà molto grande.struttura tabelle mysql - una tabella molto grande o tabelle separate?

Devo utilizzare una singola tabella con websiteid o una tabella separata per ciascun sito Web?

Apportare modifiche a un servizio dal vivo con 100s di siti Web con tabelle separate per ognuno sembra un grosso problema. D'altro canto, le prestazioni e la scalabilità saranno probabilmente un problema con dati così grandi. Eventuali suggerimenti, commenti o consigli sono i benvenuti.

risposta

8

Che ne dici di un tavolo partitioned dal sito web FK?

+0

Solo dicendo che sono d'accordo con questo, partizionamento orizzontale su PK/FK. – thr

+0

Grazie, sto controllando questa opzione – Nir

1

Direi usare il disegno che più ha senso dato i dati - in questo caso un grande tavolo.

I record saranno tutti dello stesso tipo, con le stesse colonne, quindi dal punto di vista della normalizzazione del database hanno senso averli nella stessa tabella. Un indice facilita la selezione di particolari righe, soprattutto quando le query intere possono essere soddisfatte dai dati in un singolo indice (che può spesso essere il caso).

Si noti che l'analisi dei visitatori implicherà necessariamente molte operazioni in cui non vi è un modo semplice per ottimizzare altro che operare su un numero elevato di righe contemporaneamente - ad esempio: conteggi, somme e medie. È tipico per le statistiche ad alta intensità di risorse come questa essere precalcolate e archiviate, piuttosto che essere scaricate dal vivo. È qualcosa a cui vorresti pensare.

+0

Grazie! qualcuno sa di un buon posto per leggere di questi sistemi e della loro architettura? – Nir

+0

Beh, StackOverflow può essere abbastanza buono se vuoi avere un po 'di ricerca. Anche mysqlperformanceblog.com penso sia buono, anche se forse dovresti cercare un po '. Difficile raccomandare qualcosa, potresti provare a fare un'altra domanda, immagino. – thomasrutter

1

Se i dati sono uniformi, andare con una tabella. Se hai bisogno di SELEZIONARE su tutti i siti web, avere più tabelle è . Tuttavia se scrivi abbastanza script puoi farlo con più tabelle.

È possibile utilizzare il motore di archiviazione MERGE di MySQL per eseguire SELECTs attraverso i tavoli (ma non aspettarsi buone prestazioni e fare attenzione al limite rigido di Windows sul numero di file aperti - in Linux è possibile che si usi ulimit per aumentare il limite. Non c'è modo di farlo in Windows).

Ho rotto un enorme tavolo in molte (centinaia) di tabelle e ho utilizzato MERGE per SELECT. L'ho fatto in modo che potessi eseguire la creazione e l'ottimizzazione off-line di ciascuno dei piccoli tavoli. (Ad esempio, OTTIMIZZA o ALTER TABLE ... ORDER BY). Tuttavia, le prestazioni di SELECT con MERGE mi hanno indotto a scrivere il mio motore di archiviazione personalizzato. (Descritto http://blog.coldlogic.com/categories/coldstore/'>qui)

0

Utilizzare una tabella a meno che non si riscontrino problemi di prestazioni con MySQL.

Nessuno qui non può rispondere alle domande sul rendimento, dovresti semplicemente eseguire test di prestazione per capire se avere un solo grande tavolo è sufficiente.

1

Utilizzare la struttura di dati singoli. Una volta che inizi a riscontrare problemi di prestazioni, ci sono molte soluzioni come puoi partizionare le tue tabelle con l'id del sito web noto anche come partizionamento orizzontale o puoi anche usare la replica. Tutto dipende dal rapporto tra letture e scritture.

Ma per iniziare, mantenere le cose semplici e utilizzare una tabella con indicizzazione corretta. Puoi anche determinare se hai bisogno di transazioni o no. È inoltre possibile usufruire di vari diversi motori di storage mysql come MyIsam o NDB (in clustering di memoria) per aumentare le prestazioni. Anche il caching svolge un ottimo ruolo nel scaricare il carico dal database.I dati che sono per lo più di sola lettura e possono essere facilmente calcolati vengono di solito messi nella cache e la cache serve la richiesta invece di andare al database e solo le query necessarie vanno al database.

Problemi correlati