2013-07-03 6 views
7

So che quando si utilizza un campo di testo all'interno di una tabella MySql, i dati non vengono memorizzati in linea ma solo un "puntatore" è memorizzato nella riga. Voglio solo raramente recuperare il campo di testo, quindi è meglio tenerlo nella stessa tabella ma ometterlo dai risultati della query o tenerlo in una tabella separata e partecipare a quella tabella quando voglio leggerlo?È più efficiente mantenere i campi di testo all'interno di una riga della tabella MySql o in una tabella separata e partecipare

Questa tabella potrebbe potenzialmente contenere miliardi di righe, essere partizionata e avere valori di campo di testo grandi (100k -> 1Mb).

+0

Vuoi partecipare ai campi di testo? –

+0

Beh, se è solo un puntatore, penso che sia meglio essere nella stessa tabella. Finché non lo selezioni, non penso che influenzerà le tue domande. e se si separa è solo più "ricerche" per fare il db prima di darti il ​​risultato. –

+0

Non mi unisco ai campi di testo, voglio dire unirmi a una tabella che contiene solo il campo di testo. –

risposta

0

mio prendere su di esso:

normalmente, direi che non è necessaria complicato avere un riferimento a un puntatore al testo, in particolare quando si tratta di più join, potenziale partizionamento ecc

sulla Dall'altro lato, è piuttosto un mostro di un tavolo. Se dimentichi di escludere il campo di testo o forse qualcuno, che non è ben informato sulla tua struttura dati, che lavora sullo stesso database, chi potrebbe emettere un semplice SELECT * FROM monstertable ... a seconda del server, potrebbe uccidere/bloccalo per un po 'di tempo.

In breve: per prestazioni, una singola tabella dovrebbe essere un po 'meglio, per la sicurezza/stabilità può essere meglio per separare.

un sidenode: mi chiedo se MySQL o anche un database relazionale a tutti è lo strumento giusto per questo compito (e trascorrere interminabili ore alla ricerca di alternative, sgridato e basta usare MySQL, in quanto è già installato ovunque e ben integrato;))

1

Un miliardo di righe con un campo di 100 k è, a dir poco, grande. Questo arriva a 100 Tbyte di dati (usando la definizione americana di "terabyte"). Secondo il documentation: motore di memorizzazione

L'InnoDB mantiene le tabelle InnoDB all'interno di uno spazio tabella che possono essere creati da diversi file. Ciò consente a una tabella di superare la dimensione massima del singolo file. Lo spazio tabella può includere le partizioni del disco crudo , che consente tabelle estremamente grandi. La dimensione massima del tablespace è 64TB.

In altre parole, potresti avere problemi più grandi delle prestazioni. Probabilmente diffonderai la tabella su più partizioni.

Se solo occasionalmente si recupera il testo e non lo si utilizza mai per le ricerche, suggerirei di memorizzarlo in una tabella separata. In questo modo, puoi personalizzare quella tabella per accedere a questi record. Avrai una chiave primaria usata come riferimento e tutti i riferimenti saranno attraverso quell'id.

Se si utilizza il testo per le ricerche, in particolare le ricerche combinate con i dati "fissi", la mia preferenza architettonica sarebbe quella di includerlo nella tabella di base per facilitare la ricerca tra i campi.

Tuttavia, anche con questa preferenza, è probabilmente più sicuro di metterlo in una tabella diversa. Ad esempio, MySQL crea istanze secondarie. È molto tipico usare * per una sottoquery.Si consideri un caso semplice: una query per ottenere i 1000 più recenti record in ordine di userid:

select t.* 
from (select t.* 
     from t 
     order by createddate 
     limit 1000 
    ) t 
order by userid 

L'utilizzo di t.* significa che la colonna di testo sarebbe anche essere recuperate. Quindi una query che potrebbe richiedere una frazione di secondo (con un indice) dovrebbe leggere e scrivere 1000 * 100k = 100 Mbyte di dati (almeno). Probabilmente ci vorrà un po 'di più.

In conclusione, vorrei sostenere l'inserimento della colonna di testo in una tabella in cui viene spesso eseguita la ricerca con altre colonne, ad esempio in un database di abstract di articoli scientifici. Per dati veramente grandi, lo metterei in un campo separato, quindi potrei gestire meglio lo storage in casi estremi.

Problemi correlati