Quante righe in un database sono TROPPE?


87

Ho una tabella MySQL InnoDB con 1.000.000 di record. È troppo? O i database possono gestire questo e altro? Lo chiedo perché ho notato che alcune query (ad esempio, ottenere l'ultima riga da una tabella) sono più lente (secondi) nella tabella con 1 milione di righe rispetto a una con 100.

Risposte:


114

Ho una tabella MySQL InnoDB con 1000000 registri. È troppo?

No, 1.000.000 di righe (record AKA) non sono troppe per un database.

Chiedo perché ho notato che alcune query (ad esempio, ottenere l'ultimo registro di una tabella) sono più lente (secondi) nella tabella con 1 milione di registri rispetto a una con 100.

C'è molto da spiegare in quella dichiarazione. I soliti sospetti sono:

  1. Domanda scritta male
  2. Non utilizzare una chiave primaria, ammesso che ne esista una sul tavolo
  3. Modello di dati mal progettato (struttura della tabella)
  4. Mancanza di indici

4
5. Specifiche del server obsolete <Ultima risorsa.
Sneakyness

19
@Brimstedt: Ho anche sempre pensato che il nome dovesse essere "Indices", ma non credo di aver mai visto nessuno usarlo per i database: da Wikipedia: en.wikipedia.org/w/… a Mr. Coding Horror: codinghorror. com / blog / archives / 000638.html . C'è questo interessante post SO sull'argomento: stackoverflow.com/questions/1001366 .
Daniel Vassallo

7
6. Memoria allocata insufficiente per le varie cache di innodb
Jason

per prestazioni migliori se devo usare PrimaryKey? Che dire dell'utilizzo di altre chiavi come Index, Unique? Posso usarli? grazie
user1844933

Forse il computer è impantanato con la memoria come ha detto Jason e si interrompe nel bel mezzo del processo
ytpillai

67

Ho un database con più di 97.000.000 di record ( file di dati da 30 GB ) e non ho problemi.

Ricorda solo di definire e migliorare l' indice della tua tabella .

Quindi è ovvio che 1.000.000 non è MOLTO! (Ma se non indicizzi; sì, è MOLTO)


10
L'aggiunta di una "chiave primaria" a una colonna (selezionando l'incremento automatico) sarebbe indicizzazione?
Nathan

8
@Nathan, in realtà quando assegni una colonna come chiave primaria, viene automaticamente indicizzata, ma ogni tabella può avere solo una chiave primaria, se devi aggiungere l'indice per qualche colonna, per ottimizzare le query usa questo stackoverflow.com/ a / 3002635/932473
dav

Ho una tabella con un trilione ma la selezione dei dati in formato IN LIFO è lenta?
Saurabh Chandra Patel

Definisci di non avere problemi. Quanto tempo richiede la query più complessa? Abbiamo una tabella con 100 milioni di righe e un cliente si aspetta che le query vengano eseguite in massimo 5 secondi, indipendentemente dai criteri di raggruppamento o di ordinamento utilizzati. I nostri indici potrebbero essere migliorati ma prima di bloccare tutto cercando di aggiungere un indice
Joe Yahchouchi

Il 20% delle tabelle di produzione (secondo un vecchio studio) ha più di 1 milione di righe. Ne ho visti alcuni con diversi miliardi di righe.
Rick James

19

Usa "spiega" per esaminare la tua query e vedere se c'è qualcosa di sbagliato nel piano di query.


6
Anche se questa è una buona idea, questa risposta in sé non è buona da dare a un principiante. L'output di EXPLAIN non è molto intuitivo ...
nickf

17
Non esistono altri strumenti che ti aiutino a esaminare le domande, quindi è meglio iniziare a imparare EXPLAIN, principianti o meno.
nn

30
Sarebbe bello se qualcuno potesse SPIEGARE EXPLAIN ;)
Jo E.


15

Penso che questo sia un malinteso comune: la dimensione è solo una parte dell'equazione quando si tratta di scalabilità del database. Ci sono altri problemi che sono difficili (o più difficili):

  • Quanto è grande il working set (ovvero quanti dati devono essere caricati in memoria e su cui lavorare attivamente). Se inserisci i dati e poi non fai nulla, è in realtà un problema facile da risolvere.

  • Quale livello di concorrenza è richiesto? C'è solo un utente che inserisce / legge o abbiamo molte migliaia di client che operano contemporaneamente?

  • Quali livelli di promessa / durata e coerenza delle prestazioni sono richiesti? Dobbiamo assicurarci di poter onorare ogni impegno. Va bene se la transazione media è veloce o vogliamo assicurarci che tutte le transazioni siano affidabili (controllo di qualità six sigma come - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- e-sei-sigma / ).

  • Hai bisogno di fare problemi operativi, come ALTER lo schema della tabella? In InnoDB questo è possibile, ma incredibilmente lento poiché spesso deve creare una tabella temporanea in primo piano (bloccando tutte le connessioni).

Quindi affermerò che i due problemi limitanti saranno:

  • La tua abilità nello scrivere query / avere buoni indici.
  • Quanto dolore puoi tollerare in attesa delle dichiarazioni ALTER TABLE.

2
Modifica: i consigli su ALTER TABLE che creano tabelle temporanee sono un po 'datati. MySQL 5.5 ha una rapida creazione dell'indice e 5.6 ora ha DDL online.
Morgan Tocker

3

Se intendi 1 milione di righe, dipende da come viene eseguita l'indicizzazione e dalla configurazione del tuo hardware. Un milione di righe non è una grande quantità per un database aziendale o anche per un database di sviluppo su apparecchiature decenti.

se intendi 1 milione di colonne (non sono nemmeno sicuro che sia possibile in MySQL) allora sì, questo sembra un po 'grande e probabilmente causerà problemi.


3

Registrati? Intendi record?

Un milione di record non è un grosso problema per un database di questi tempi. Se riscontri problemi, probabilmente non è il sistema di database stesso, ma piuttosto l'hardware su cui lo stai eseguendo. Molto probabilmente non avrai problemi con il DB prima di esaurire l'hardware per lanciarlo.

Ora, ovviamente alcune query sono più lente di altre, ma se due query molto simili vengono eseguite in tempi molto diversi, è necessario capire qual è il piano di esecuzione del database e ottimizzarlo, ovvero utilizzare indici corretti, normalizzazione adeguata, ecc.

Per inciso, non esiste un "ultimo" record in una tabella, dal punto di vista logico non hanno un ordine intrinseco.


Intendo qualcosa come "SELECT * FROM table ORDER BY id DESC LIMIT 0"
Juanjo Conti

4
Forse hai bisogno SELECT LAST_INSERT_ID()invece di quella query.
True Soft

3

Ho visto tabelle non partizionate con diversi miliardi di record (indicizzati), che si uniscono autonomamente per il lavoro analitico. Alla fine abbiamo suddiviso la cosa, ma onestamente non abbiamo visto molta differenza.

Detto questo, era in Oracle e non ho testato quel volume di dati in MySQL. Gli indici sono tuoi amici :)


2

Supponendo che tu intenda "record" con "registri" no, non è troppo, MySQL scala molto bene e può contenere tutti i record che hai spazio sul tuo disco rigido.

Ovviamente però le query di ricerca saranno più lente. Non c'è davvero alcun modo per aggirare questo tranne assicurarsi che i campi siano indicizzati correttamente.


2
Tecnicamente, la dimensione della tabella potrebbe anche essere limitata dalla dimensione massima del file del file system che stai utilizzando.
tster

0

Più grande diventa la tabella (come in più righe in essa), le query più lente verranno in genere eseguite se non ci sono indici. Una volta aggiunti gli indici corretti, le prestazioni delle query dovrebbero migliorare o almeno non peggiorare tanto quanto la tabella cresce. Tuttavia, se la query stessa restituisce più righe man mano che la tabella diventa più grande, inizierai a vedere di nuovo il degrado.

Sebbene 1 milione di righe non siano così tante, dipende anche dalla quantità di memoria disponibile sul server DB. Se la tabella è troppo grande per essere memorizzata nella cache dal server, le query saranno più lente.


0

L'utilizzo della query fornita sarà eccezionalmente lento a causa dell'utilizzo di un metodo di unione di ordinamento per ordinare i dati.

Consiglierei di ripensare il design in modo da utilizzare gli indici per recuperarlo o assicurarti che sia già ordinato in quel modo, quindi non è necessario alcun ordinamento.

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.