2011-01-20 3 views
8

Ho lavorato al mio database di sviluppo e ho ottimizzato le sue prestazioni.MySql, come posso esportare gli indici dal mio database di sviluppo al mio database di produzione?

Tuttavia, con mia sorpresa non riesco a trovare un modo per esportare gli indici nel mio database di produzione.

Ho pensato che ci sarebbe stato un modo semplice per farlo. Non voglio sostituire i dati nel mio database di produzione.

Il problema principale è che non riesco a vedere l'ordinamento negli indici, quindi sarà difficile persino farlo manualmente.

risposta

10

Forse intendi "Come posso ricreare i miei indici di sviluppo sul mio (esistente) database live"?

Se è così, penso che i comandi SQL che stai cercando siano;

SHOW CREATE TABLE {tablename};

ALTER TABLE ADD INDEX {nome_indice} (col1, col2)

ALTER TABLE DROP INDEX {nome_indice}

È possibile copiare la "chiave" e le righe "costrizione" da "SHOW CREATE TABLE" uscita e rimetterlo in "ALTER TABLE ADD INDEX".

dev mysql> SHOW CREATE TABLE city; 
CREATE TABLE `city` (
    `id` smallint(4) unsigned NOT NULL auto_increment, 
    `city` varchar(50) character set utf8 collate utf8_bin NOT NULL default '', 
    `region_id` smallint(4) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `region_idx` (region_id), 
    CONSTRAINT `city_ibfk_1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB; 

live mysql> SHOW CREATE TABLE city; 
CREATE TABLE `city` (
    `id` smallint(4) unsigned NOT NULL auto_increment, 
    `city` varchar(50) character set utf8 collate utf8_bin NOT NULL default '', 
    `region_id` smallint(4) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

live mysql> ALTER TABLE `city` ADD KEY `region_idx` (region_id); 
live mysql> ALTER TABLE `city` ADD CONSTRAINT `city_ibfk_1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT; 

Spero che questo aiuti!

1

è possibile utilizzare il seguente comando per prendere una discarica

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz 

e gli indici saranno copiati automaticamente.

1

Credo che tu stia cercando di esportare gli indici stessi e non solo il codice per rigenerarli in produzione, giusto? (Sto assumendo questo perché il carico di generare questi indici non è favorevole nella maggior parte degli ambienti di produzione.)

L'utilità mysqldump è utile se le prestazioni non sono la vostra preoccupazione principale, e io la uso sempre. Se stai cercando un metodo molto veloce, ti suggerisco di copiare i file InnoDB da un database freddo all'altro (supponendo che siano esattamente la stessa versione di MySQL con la stessa configurazione e esattamente la stessa cosa che ci si aspetta comportamento, ecc.). Questo metodo è pericoloso se ci sono differenze tra i sistemi.

Sembra che, nella tua situazione, potresti voler prima copiare i tuoi dati buoni nell'ambiente di test.Il mio ciclo di sviluppo segue in genere questo approccio: il DDL passa dal testing alla produzione attraverso la programmazione e il DML passa dalla produzione al testing attraverso l'uso effettivo del sistema.

+3

si prega di fornire risposte al posto delle ipotesi, questo appartiene ai commenti. – Tom

1

Ho anche server di sviluppo e produzione con la stessa struttura di database.

Ho modificato gli indici su entrambi, quindi ho voluto unire tutti insieme. Quindi avevo bisogno di confrontare i dati con Notepad +.

Ecco come si esportano gli indici per tutte le tabelle, tutti i database e come filtrare e li confrontano:

--- Single table: 
    SHOW INDEX FROM mydb.mytable; 
    SHOW INDEX FROM mytable; 

--- Multi tables, databases: 
    USE information_schema; 
    SELECT * FROM `statistics` ORDER BY TABLE_SCHEMA ASC, TABLE_NAME ASC, INDEX_NAME ASC; 

Ora, phpMyAdmin -> Esporta in CSV Excel:

aggiunge una riga di intestazione -> cancella tutte le colonne ma lascia "database_name nome_tabella valore colonna indice"

Quindi, filtra per database.

Copia tutto da database1 a un blocco note + schermo 1, filtro excel database2, copia tutto in blocco note + schermo 2 -> CONFRONTA!

0

Estensione alla risposta di @ origo. C'è un caso in cui ho bisogno di estrarre il DDL per un gruppo di indici. Questo script fa il lavoro.

fonte: https://rogerpadilla.wordpress.com/2008/12/02/mysql-export-indexes/

SELECT 
CONCAT(
'ALTER TABLE ' , 
TABLE_NAME, 
' ', 
'ADD ', 
IF(NON_UNIQUE = 1, 
CASE UPPER(INDEX_TYPE) 
WHEN 'FULLTEXT' THEN 'FULLTEXT INDEX' 
WHEN 'SPATIAL' THEN 'SPATIAL INDEX' 
ELSE CONCAT('INDEX ', 
INDEX_NAME, 
' USING ', 
INDEX_TYPE 
) 
END, 
IF(UPPER(INDEX_NAME) = 'PRIMARY', 
CONCAT('PRIMARY KEY USING ', 
INDEX_TYPE 
), 
CONCAT('UNIQUE INDEX ', 
INDEX_NAME, 
' USING ', 
INDEX_TYPE 
) 
) 
), 
'(', 
GROUP_CONCAT(
DISTINCT 
CONCAT('', COLUMN_NAME, '') 
ORDER BY SEQ_IN_INDEX ASC 
SEPARATOR ', ' 
), 
');' 
) AS 'Show_Add_Indexes' 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA = 'PLEASE CHANGE HERE' 
GROUP BY TABLE_NAME, INDEX_NAME 
ORDER BY TABLE_NAME ASC, INDEX_NAME ASC;