2010-05-24 17 views
5

Ho 10 milioni di righe nella mia tabella in MySQL e 7 indici su questa tabella. Ora, quando provo ad aggiungere 8, ci vuole del tempo infinito per farlo. C'è un modo per aggirare questo problema per aggiungere facilmente e velocemente l'8 ° indice?Come creare indici più velocemente?

+0

Non dovrebbe essere infinito. Si prega di fornire dettagli dello schema e dell'indice della tabella. –

+0

E se ci vuole "per sempre", controlla se sei a corto di spazio su disco da qualche parte - la creazione di indici può richiedere un'enorme quantità di spazio temporaneo. – nos

+0

È un bug di MySQL che ogni indice successivo richiede più tempo. Ho 400 MB reali e 1,6 MB di scambio mem, e non è usato affatto durante la creazione di indice, e ho 20 GB di spazio –

risposta

2

Questo è uno dei mille modi in cui MySQL fa schifo. In base alla progettazione ...

Dettagli: http://lists.mysql.com/mysql/202489

e non mi importa se perdo karma per questa risposta.

+0

Sì, penso che io stia parlando di –

+0

Sono rimasto scioccato quando ho visto che l'esecuzione di un ALTER TABLE per modificare il valore predefinito - o il nullability - di una colonna, veniva eseguita copiando l'intera tabella e ricreando tutti gli indici. Queste cose richiedono pochissimo tempo su altri DMBS; il modo consigliato di farlo su MySQL per tabelle di grandi dimensioni è stato di andare in giro con il filesystem - cambiando la definizione della tabella con un file di dati vuoto e rimettendo a posto il file di dati completo. –

+1

Il poster di questo articolo è completamente sbagliato. MySQL ricostruisce le tabelle in molti casi quando si esegue ALTER TABLE, ma non ricostruisce mai la tabella più di una volta per istruzione ALTER; inoltre, se lo desideri, puoi fare un numero arbitrario di modifiche con un singolo ALTER. – MarkR

5

No, il tempo necessario per creare un indice è direttamente proporzionale alla quantità di dati che si hanno. In MS SQL creo degli indici su una tabella con tanti record in circa 10 minuti.

EDIT: Dopo aver visto il commento, si prega di elaborare su infinito. Per definizione, stai dicendo che non finisce mai, la mia risposta è legata a una creazione di indice a lunga corsa e non infinita.

+0

Sì, ci sono voluti 15 minuti –

+0

Allora sei circa buono come si arriva. L'indicizzazione è un'attività molto intensa, specialmente con molti record. –

0

Quale motore stai utilizzando? L'implementazione di ALTER TABLE ... CREATE INDEX varia in modo significativo.

Utilizzando MyISAM, qualsiasi modifica dell'indice richiede una ricostruzione completa della tabella. Questo non è inerente al motore, ma un bug che non è mai stato risolto.

Utilizzando InnoDB, la creazione di un indice secondario non richiede una ricostruzione della tabella, ma questa ottimizzazione è disponibile solo se si utilizza il plug-in InnoDB (anziché il motore più vecchio, spedito). La modifica della chiave primaria richiede sempre una ricostruzione, perché è in cluster.

La ricostruzione della tabella (in entrambi i casi) richiede molto lavoro in quanto deve ricostruire tutti gli indici esistenti, oltre a riscrivere le righe, per completare l'operazione. Se il tuo tavolo si adatta alla RAM (file da 10 milioni di suoni come dovrebbero fare facilmente), questo è relativamente veloce.

La ricostruzione di un tavolo che non si adatta alla ram è piuttosto costosa, consiglio di evitarla se possibile.

La ricostruzione di un singolo indice che non si adatta alla ram è MOLTO costoso ed è meglio evitare.

Quante volte è necessario aggiungere nuovi indici? Forse puoi popolare le tabelle con l'indice già creato?

Problemi correlati