我一直在研究我的开发数据库,并调整了它的性能。MySql,我怎样才能从我的开发数据库导出索引到我的生产数据库?
但是,令我惊讶的是我找不到将索引导出到我的生产数据库的方法。
我认为会有一个简单的方法来做到这一点。我不想替换生产数据库中的数据。
主要的问题是我看不到索引中的排序,所以它很难手动完成。
我一直在研究我的开发数据库,并调整了它的性能。MySql,我怎样才能从我的开发数据库导出索引到我的生产数据库?
但是,令我惊讶的是我找不到将索引导出到我的生产数据库的方法。
我认为会有一个简单的方法来做到这一点。我不想替换生产数据库中的数据。
主要的问题是我看不到索引中的排序,所以它很难手动完成。
也许你的意思是“如何在我的(现有)实时数据库上重新创建我的开发索引”?
如果是这样,我认为你正在寻找的SQL命令是;
SHOW CREATE TABLE {tablename};
ALTER TABLE添加索引{INDEX_NAME}(COL1,COL2)
ALTER TABLE DROP INDEX {INDEX_NAME}
可以复制的 “钥匙” 和 “约束” 行 “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;
希望这有助于!
首先,请阅读关于how-to Export MySQL Indexes using a SQL query的教程。进一步:
如果您完成数据库的DUMP并将其导入到另一个(使用PHPMyAdmin等),索引将得到重新生成。
如果可能,您可以将整个MySQL数据库文件夹的内容复制到生产数据库。这也会很快做到这一点。 Read more here at MySQL docs.
可以使用下面的命令来拉屎
mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz
和索引将被自动复制。
我相信你试图导出索引本身,而不仅仅是在生产中重新生成它们的代码,对吧? (我假设这是因为在大多数生产环境中生成这些索引的负载不利。)
如果性能不是您主要关心的话,那么mysqldump实用程序非常有用,并且我一直都在使用它。但是,如果您正在寻找一种非常快速的方法,我会建议将实际的InnoDB文件从一个冷数据库拷贝到另一个冷数据库(假设它们完全相同的MySQL版本,配置完全相同,并且期望完全相同行为等)。如果系统之间存在任何差异,则此方法很危险。
听起来像,在您的情况下,您可能首先需要将良好的数据复制到测试环境。我的开发周期通常采用这种方法:DDL从测试流程通过编程流向生产流程,DML从生产流程通过实际使用系统流向测试流程。
我也有开发和生产服务器具有相同的数据库结构。
我修改了两个索引,所以我想合并在一起。所以我需要将数据与记事本+进行比较。
这里是你如何导出索引的所有表,所有数据库和如何筛选并加以比较:
--- 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索引列值”
然后,按数据库进行过滤。
全部从database1复制到记事本+屏幕1,过滤excel database2,全部复制到记事本+屏幕2 - > COMPARE!
扩展@ 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;
请提供答案,而不是假设,这属于意见。 – Tom 2012-09-20 05:03:07