2011-07-14 12 views
7

Ho circa 28 milioni di record da importare in un database mySql. Il record contiene informazioni personali sui membri negli Stati Uniti e sarà ricercabile dagli stati.Divisione di un grande tavolo mySql in più piccoli - ne vale la pena?

La mia domanda è: è più efficiente suddividere il tavolo in tavoli più piccoli invece di tenere tutto in un unico grande tavolo? Quello che avevo in mente era di dividerli in 50 tabelle separate che rappresentavano i 50 stati come questo: membri_CA, membri_AZ, membri_TX, ecc;

questo modo ho potuto fare una query come questa:

'SELECT * FROM members_' . $_POST['state'] . ' WHERE members_name LIKE "John Doe" '; 

In questo modo ho solo a che fare con i dati per un determinato stato in una sola volta. Intuitivamente ha molto senso, ma sarei curioso di sentire altre opinioni.

Grazie in anticipo.

+1

Quindi, se si cerca un nome utente in tutti gli stati, verranno utilizzati 50 join? – Jacob

+8

Non hai mai, mai voglia di fare la cosa che hai descritto. Tenerlo in 1 tavolo, mai dividerlo in 50 tavoli. C'è qualcosa chiamato partizionamento e MySQL ti permette di partizionare il tuo tavolo secondo alcune regole. Cercalo e prendilo da lì, e MAI, non pensare mai di creare una tabella separata se qualcosa differisce in 1 attributo. È un orribile design db e un incubo da mantenere, per non parlare dell'uso. –

risposta

16

Ho inserito inizialmente un commento ma pubblicherò come risposta ora.

Mai e poi mai pensare di creare tabelle X in base a una differenza di attributo. Non è così che vanno le cose.

Se la tabella avrà 28 milioni di righe, pensate al partizionamento per dividerlo in serie logiche più piccole.

È possibile leggere il partizionamento allo MySQL documentation.

L'altra cosa è scegliere il giusto design di db e scegliere gli indici in modo corretto.

La terza cosa è che si evita la terribile idea di utilizzare $ _POST direttamente nella query, poiché probabilmente non si vorrebbe che qualcuno inserisse SQL e non inserisse database, tabelle o altro.

L'ultima cosa è scegliere l'hardware appropriato per l'attività, non si desidera un'applicazione di questo tipo in esecuzione su VPS con 500 mb di ram o 1 gig di ram.

+0

Grazie, questo è esattamente quello che stavo cercando. – higgenkreuz

0

La mia prima risposta è che è necessario mantenere tutti i dati simili insieme e tenerlo come una tabella. Dovresti esaminare l'inserimento di indici sul tuo tavolo per aumentare le prestazioni, ma non suddividerlo in tabelle più piccole.

1

Se si crea un indice sulla colonna di stato, una selezione su tutti i membri di uno stato sarà efficiente quanto l'utilizzo di tabelle separate. Splittimg il tavolo ha un sacco di svantaggi. Se aggiungi colonne devi aggiungerle in 50 tabelle. Se vuoi dati provenienti da stati diversi, devi usare le dichiarazioni di unione che saranno molto brutte e inefficienti. Consiglio vivamente di attaccare a un tavolo.

2

Do not farlo. Conserva i dati simili nella stessa tabella. Avrai grossi problemi nell'implementazione delle decisioni logiche e nella creazione di query quando la decisione si estende su molti stati. Inoltre, se è necessario modificare la definizione del database come aggiungere colonne, sarà necessario eseguire la stessa operazione su tutte le numerose tabelle (apparentemente infinite).

Utilizzare l'indicizzazione per aumentare le prestazioni ma attenersi al singolo tavolo !!!

È anche possibile aumentare la cache di memoria, per un calo delle prestazioni. Follow this article to do so.

Problemi correlati