MySql,如何将开发数据库中的索引导出到生产数据库?

问题描述 投票:11回答:6

我一直在研究我的开发数据库,​​并调整了它的性能。

但是,令我惊讶的是,我找不到将索引导出到生产数据库的方法。

我认为有一种简单的方法可以做到这一点。我不想替换生产数据库中的数据。

主要问题是我无法在索引中看到排序,因此甚至难以手动完成。

mysql import export indexing
6个回答
15
投票

也许你的意思是“我如何在我的(现有)实时数据库上重新创建我的开发索引”?

如果是这样,我认为你正在寻找的SQL命令是;

SHOW CREATE TABLE {tablename};

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

ALTER TABLE DROP INDEX {index_name}

您可以从“SHOW CREATE TABLE”输出中复制“KEY”和“CONSTRAINT”行,并将其放回“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
投票

首先,阅读有关how-to Export MySQL Indexes using a SQL query的教程。进一步:

  1. 如果您确实完成了数据库的DUMP并将其导入另一个(使用PHPMyAdmin等),则索引将重新生成。
  2. 如果可能,您可以将整个MySQL数据库文件夹的内容复制到生产数据库。这也很快就能解决问题。 Read more here at MySQL docs.

3
投票

延伸@ 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
投票

您可以使用以下命令进行转储

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

和索引将自动复制。


1
投票

我相信你试图自己导出索引,而不仅仅是在生产中重新生成它们的代码,对吧? (我假设这是因为在大多数生产环境中生成这些索引的负载不利。)

如果性能不是您主要考虑的问题,mysqldump实用程序非常有用,我会一直使用它。但是,如果你正在寻找一种非常快速的方法,我建议将实际的InnoDB文件从一个冷数据库复制到另一个冷数据库(假设它们是完全相同的MySQL版本,具有完全相同的配置和完全相同的预期行为等)。如果系统之间存在任何差异,则此方法很危险。

听起来,在您的情况下,您可能希望首先将好的数据复制到测试环境中。我的开发周期通常遵循这种方法:DDL通过编程从测试流向生产,DML通过系统的实际使用从生产流向测试。


1
投票

我还有具有相同数据库结构的开发和生产服务器。

我修改了它们的索引,所以我想将它们合并在一起。所以我需要将数据与Notepad +进行比较。

以下是导出所有表,所有数据库以及如何过滤和比较它们的索引的方法:

--- 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 - >导出到CSV-Excel:

添加标题行 - >删除所有列但保留“database_name table_name index column value”

然后,按数据库过滤。

将所有从database1复制到记事本+屏幕1,过滤excel database2,将所有内容复制到记事本+屏幕2 - >比较!

© www.soinside.com 2019 - 2024. All rights reserved.