Meglio creare una tabella per ciascun account utente o una tabella enorme per tutti i dati utente in MYSQL


8

Sto creando una directory web che consentirà ai singoli utenti di registrarsi per un account e archiviare essenzialmente documenti di testo in una voce del database mysql.

Inizialmente ci saranno probabilmente solo poche centinaia di utenti, ma speriamo di avere da 10.000 a 100.000 ad un certo punto. E ogni utente sarebbe in grado di caricare 100-200 "documenti".

Sarebbe più efficiente creare una tabella di grandi dimensioni, indicizzata da un numero utente? Che potrebbe teoricamente crescere fino a 20.000.000 di voci. O per andare avanti e creare una tabella per ogni utente con i loro singoli documenti?

Suppongo che non sia salutare avere migliaia di tabelle in un database, ma non riesco davvero a trovare dati concreti su questo.

Risposte:


7

MySQL può facilmente far fronte a 20 milioni di righe se è correttamente indicizzato. Abbiamo tabelle con oltre un miliardo di righe.

Avere un tavolo è più pulito. Non è necessario fare magie nell'applicazione in base all'utente (nome). È più facile fare statistiche anche sulla tabella dei documenti.

Ritornerei sicuramente con l'approccio a un grande tavolo. Se sei preoccupato per le dimensioni (fisiche) della tabella, dovresti prendere in considerazione la partizione della tabella dei documenti. http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html


Grazie per la risposta. Allora andrò sicuramente con una sola tabella e cercherò l'approccio al partizionamento. Una domanda però, cosa si intende esattamente per una tabella correttamente indicizzata? Ho sentito molto questo riferimento e presumo che significhi che la tabella del database necessita di una chiave di indice correttamente definita. Ma c'è di più oltre a quello per la migliore ottimizzazione.
Keith

Con correttamente indicizzato intendevo avere almeno un indice composito su user_id con le colonne che stai filtrando o ordinando sulla tabella del documento e indicizzare il nome utente sulla tabella dell'utente (probabilmente un indice parziale è sufficiente per verificare la cardinalità 90-95 % è abbastanza). Ad esempio: sqlfiddle.com/#!2/9fb15/2 (Nel mio caso l'indice parziale 5 sulla username cardinalità è del 50%)
Károly Nagy

Penso di aver capito, grazie per l'aiuto. Un'altra domanda, supponendo che tu abbia una chiave di indice primaria per ogni tabella, aiuta ancora l'ottimizzazione a definire colonne aggiuntive che sai che dovrai cercare regolarmente (come la categoria padre) come indice? C'è un aspetto negativo nella definizione di una chiave primaria o unica e 2-4 indici per ogni tabella?
Keith,

Gli indici aiuteranno, sì. In realtà dovresti sempre avere indici sulle colonne su cui stai filtrando, altrimenti la query finirà nella ricerca a scansione completa. L'unico aspetto negativo (oltre alla dimensione dell'indice) sono gli inserimenti e gli aggiornamenti più lenti, tuttavia a partire dalla versione 5.1 con plug-in InnoDB e 5.5 per impostazione predefinita, MySQL ha una creazione rapida dell'indice ( dev.mysql.com/doc/refman/5.5/en/… ), quindi non lo è più un grosso problema.
Károly Nagy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.