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

Posted

技术标签:

【中文标题】MySql,如何将索引从我的开发数据库导出到我的生产数据库?【英文标题】:MySql, how can I export indexes from my development database to my production database? 【发布时间】:2011-06-12 06:31:12 【问题描述】:

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

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

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

主要问题是我在索引中看不到排序,因此即使手动进行排序也很困难。

【问题讨论】:

【参考方案1】:

首先,阅读这里关于how-to Export mysql Indexes using a SQL query 的教程。进一步:

    如果您完成了数据库的 DUMP 并将其导入到另一个数据库(使用 phpMyAdmin 等),索引将重新生成。

    如果可能,您可以将整个 MySQL 数据库文件夹的内容复制到生产数据库。这也会很快奏效。 Read more here at MySQL docs.

【讨论】:

【参考方案2】:

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

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

并且索引将被自动复制。

【讨论】:

但是没有 FULLTEXT 索引?【参考方案3】:

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

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

显示创建表 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】:

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

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

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

【讨论】:

请提供答案而不是假设,这属于 cmets。【参考方案5】:

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

我修改了它们的索引,所以我想将它们合并在一起。所以我需要用记事本+比较数据。

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

--- 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全部复制到notepad+ screen 1,过滤excel database2,copy all to notepad+ screen 2 -> COMPARE!

【讨论】:

【参考方案6】:

扩展@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;

【讨论】:

如果您的索引名称包含空格,您可能需要将 INDEX_NAME 替换为 '',INDEX_NAME,''! @viggy28 我收到this is incompatible with sql_mode=only_full_group_by 错误。我通过运行SET sql_mode = '' 解决了这个问题

以上是关于MySql,如何将索引从我的开发数据库导出到我的生产数据库?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将 2 个属性从我的 App Store 版本交换到我当前的开发版本?

MS SQL Server - 如何将所有存储过程从我的机器导出到我的朋友机器?

如何将json数组插入mysql数据库

我如何通过 json 将数据从我的设备发送到我的 php 文件

如何将数据从我的数据库 (Firebase Firestore) 发送到我的 React Native 应用程序?