2012-06-06 12 views
11

il succoReindicizzazione enorme database (la Wikipedia in inglese) in modo efficiente

Prima di eseguire una massiccia 40+ GB importazione della Wikipedia inglese, ho dovuto rimuovere temporaneamente gli indici e campi di incremento automatico da tre tavoli ('page', 'revision' e 'text') per gestire il carico. Ora finalmente ho importato con successo la Wikipedia in inglese sul mio computer locale e ho creato un mirror locale (API MediaWiki). Sìì!

Tuttavia, ora devo ricreare gli indici e i campi di auto-incremento in meno di un decennio. Fortunatamente, (1) ho preso molte schermate delle tabelle rilevanti in phpmyadmin prima di rimuovere gli indici e i campi; (2) Posso spiegare con estrema precisione i passi che ho compiuto prima dell'importazione; e (3) questo non dovrebbe essere troppo difficile per chiunque parli fluentemente con MySQL. Sfortunatamente, non ho alcuna esperienza in MySQL, quindi le spiegazioni di "piccoli passi" sarebbero estremamente utili.

APPUNTO quello che ho fatto (PREPARAZIONE per l'importazione):

passaggi 1, 2, 3: Questa immagine descrive la tabella pagina prima che ho modificato il campo page_id facendo clic su 'Change' e deselezionare 'Auto-Increment' (in preparazione per l'importazione). Ho eseguito esattamente le stesse modifiche per il campo rev_id nella tabella revisione e old_id nella tabella testo ma omesso lo schermo-colpi per evitare ridondanza.

table 'page' before modification of 'page_id'

Fase 4: Questa immagine descrive gli indici per la tabella pagina prima ho lasciato cadere tutti loro.

indexes for table 'page' before I dropped them

Fase 5: Questa immagine descrive gli indici per la tabella revisione prima ho lasciato cadere tutti loro.

indexes for table 'revision' before I dropped them

Fase 6: Questa immagine descrive gli indici per la tabella testo prima ho lasciato cadere tutti loro.

indexes for table 'text' before I dropped them

COSA ho bisogno ora (il ripristino dopo l'importazione):

Ho solo bisogno di ripristinare gli indici originali e campi di incremento automatico senza aspettare un centinaio di anni.

set-up dettagli: PHP 5.3.8 (apache2handler), MySQL 5.5.16 (InnoDB), Apache 2.2.21, Ubuntu 12.04 LTS, MediaWiki 1.19.0 (wiki privato)

+1

+1 per una domanda ben scritta, ma temo che con set di dati di queste dimensioni, la creazione di indici richiederà un po 'di tempo, indipendentemente da come lo si fa. Se si trattava di MyISAM, avresti potuto evitare di eliminare gli indici prima di importarli: nelle tabelle MyISAM, puoi semplicemente disabilitarli e riattivarli dopo aver completato l'importazione dei dati, in tal caso MySQL riparerà automaticamente l'indice ordinando. Ma anche allora, l'ordinamento di 40 GB di dati richiederà un po 'di tempo anche su un sistema veloce. E stai usando InnoDB, in cui questa non è una possibilità AFAIK. – Daan

+0

Non credo che disabilitare e abilitare sia più veloce della semplice creazione di un nuovo indice. Si parte da zero, si ordinano i dati e si scrive l'indice. – usr

+0

Ricorda che sono un novizio MySQL completo. So cosa ho fatto, ma non ho idea di come ordinare, reindicizzare, ecc. Quindi sarebbe molto utile se hai spiegato con il codice. Se si rivela che disabilitare e abilitare l'utilizzo di MyISAM ha reso la reindicizzazione drasticamente più veloce, ho sempre potuto ricostruire tutto da zero - l'ho fatto così tante volte, potevo facilmente farlo di nuovo in circa 5 ore. La chiave è che non conosco quasi nulla di MySQL, quindi per favore sii specifico e fornisci esempi di codice se possibile. –

risposta

4

mi piace molto Wikipedia quindi cercherò di aiutare.

è necessario utilizzare un sacco di

ALTER TABLE 

Aggiungere le chiavi primarie

ALTER TABLE page ADD PRIMARY KEY (page_id); 
ALTER TABLE revision ADD PRIMARY KEY (rev_id); 
ALTER TABLE text ADD PRIMARY KEY (old_id); 

Aggiungere incrementi Auto Back

ALTER TABLE page MODIFY COLUMN page_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 

ho bisogno le descrizioni di tabella per tutte le tabelle prima di continuare. Se rev_id e old_id sono stesse definizioni come page_id poi:

ALTER TABLE revision MODIFY COLUMN rev_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 
ALTER TABLE text MODIFY COLUMN old_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; 

Aggiungi chiavi univoche

ALTER TABLE page ADD UNIQUE name_title(page_namespace, page_title); 
ALTER TABLE revision ADD UNIQUE rev_page_id(rev_page, rev_id); 

Altri rilevamenti

ALTER TABLE page ADD INDEX page_random(page_random); 
ALTER TABLE page ADD INDEX page_len(page_len); 
ALTER TABLE page ADD INDEX page_redirect_namespace(page_is_redirect, page_namespace, page_len); 
ALTER TABLE revision ADD INDEX rev_timestamp(rev_timestamp); 
ALTER TABLE revision ADD INDEX page_timestamp(rev_page, rev_timestamp); 
ALTER TABLE revision ADD INDEX user_timestamp(rev_user, rev_timestamp); 
ALTER TABLE revision ADD INDEX user_text_timestamp(rev_user_text, rev_timestamp); 

Anche in questo caso, ci possono essere le definizioni delle colonne che cambiano questa roba. È necessario fornire le informazioni CREATE TABLE.

+0

È questo che intendi? Questa è la tabella di revisione http://imageshack.us/photo/my-images/38/revid.png/ e la tabella di testo è visibile nella parte superiore di http://imageshack.us/photo/my-images/ 59/textindex.png/ In caso negativo, dove dovrei cercare? Ho un sacco di altre schermate. –

+2

@BrianSchmitz Yup ha apportato alcune modifiche e ora tutto dovrebbe funzionare. In futuro, usa "SHOW CREATE TABLE table_name" invece di screenshot di phpmyadmin. – saccharine

+0

Eccellente. Mi aspetto che la reindicizzazione richieda un po 'di tempo, ma saresti in grado di creare un campo di gioco molto, molto approssimativo, sull'ordine di grandezza del tempo di elaborazione di cui stiamo parlando? Ore? Giorni? (Sto facendo di tutto su un laptop abbastanza robusto.) In caso contrario, capisco perché so di non aver fornito molte informazioni. –

Problemi correlati