MySql, как я могу экспортировать индексы из моей базы данных разработки в мою производственную базу данных? - PullRequest
11 голосов
/ 20 января 2011

Я работал над своей базой данных разработки и настроил ее производительность.

Однако, к моему удивлению, я не могу найти способ экспортировать индексы в свою производственную базу данных.

Я думал, что будет простой способ сделать это. Я не хочу заменять данные в моей производственной базе данных.

Основная проблема в том, что я не вижу сортировки в индексах, поэтому будет трудно даже сделать это вручную.

Ответы [ 6 ]

15 голосов
/ 20 января 2011

Возможно, вы имеете в виду «Как мне заново создать мои индексы разработки в моей (существующей) действующей базе данных»?

Если это так, я думаю, что SQL-команды, которые вы ищете, являются:

ПОКАЗАТЬ CREATE TABLE {tablename};

ИНДЕКС ALTER TABLE ADD {index_name} (col1, col2)

ИНДЕКС ALTER TABLE DROP {index_name}

Вы можете скопировать строки «KEY» и «CONSTRAINT» из вывода «SHOW CREATE TABLE» и поместить их обратно в «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;

Надеюсь, это поможет!

4 голосов
/ 20 января 2011

Во-первых, прочтите здесь учебник о инструкции по экспорту индексов MySQL с помощью SQL-запроса . Далее:

  1. Если вы выполните DUMP своей базы данных и ИМПОРТРУЕТЕ ее в другую (используя PHPMyAdmin и т. Д.), Индексы будут восстановлены.

  2. Если возможно, вы можете скопировать содержимое всей папки базы данных MySQL в рабочую базу данных. Это тоже поможет, быстро. Подробнее читайте здесь в документации по MySQL.

3 голосов
/ 16 февраля 2018

Распространение ответа @ origo. Есть случай, когда мне нужно было извлечь DDL для набора индексов. Этот скрипт делает работу.

источник: 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;
2 голосов
/ 20 января 2011

вы можете использовать следующую команду, чтобы получить дамп

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

и индексы будут скопированы автоматически.

1 голос
/ 03 сентября 2017

У меня также есть серверы разработки и производства с одинаковой структурой базы данных.

Я изменил индексы для них обоих, поэтому я хотел объединить все вместе.Поэтому мне нужно было сравнить данные с помощью Блокнота +.

Вот как вы экспортируете индексы для всех таблиц, всех баз данных и как их фильтровать и сравнивать:

--- 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;

Теперь phpMyAdmin -> Exportв CSV-Excel:

добавить строку заголовка -> удалить все столбцы, но оставить «значение столбца базы данных имя_значения столбца индекса»

Затем выполнить фильтрацию по базе данных.

Копировать всебазы данных1 в блокнот + экран 1, отфильтруйте базу данных Excel2, скопируйте все в блокнот + экран 2 -> СРАВНИТЬ!

1 голос
/ 20 сентября 2012

Я полагаю, что вы пытаетесь экспортировать сами индексы, а не просто код для их регенерации, не так ли?(Я предполагаю, что это связано с тем, что в большинстве производственных сред нагрузка на генерацию этих индексов невыгодна.)

Утилита mysqldump полезна, если производительность не является вашей основной задачей, и я использую ее постоянно.Однако, если вы ищете очень быстрый метод, я бы предложил скопировать фактические файлы InnoDB из одной холодной базы данных в другую (при условии, что они точно такой же версии MySQL с точно такой же конфигурацией и точно такой же ожидаемойповедение и т. д.).Этот метод опасен, если между системами существуют какие-либо различия.

Похоже, в вашей ситуации вы можете сначала скопировать ваши хорошие данные в среду тестирования.Мой цикл разработки обычно следует этому подходу: DDL переходит от тестирования к производству через программирование, а DML переходит от производства к тестированию через реальное использование системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...