我一直在研究我的开发数据库,并调整了它的性能。
然而,令我惊讶的是,我找不到将索引导出到生产数据库的方法。
我认为有一种简单的方法可以做到这一点。我不想替换生产数据库中的数据。
主要问题是我无法在索引中看到排序,因此甚至难以手动进行排序。
答案 0 :(得分: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;
希望这有帮助!
答案 1 :(得分:4)
首先,请阅读有关how-to Export MySQL Indexes using a SQL query的教程。进一步:
如果您确实完成了数据库的DUMP并将其导入另一个(使用PHPMyAdmin等),则索引将重新生成。
如果可能,您可以将整个MySQL数据库文件夹的内容复制到生产数据库。这也很快就能解决问题。的 Read more here at MySQL docs. 强>
答案 2 :(得分: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;
答案 3 :(得分:2)
您可以使用以下命令进行转储
mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz
并自动复制索引。
答案 4 :(得分:1)
我相信你试图自己导出索引,而不仅仅是在生产中重新生成它们的代码,对吗? (我假设这是因为在大多数生产环境中生成这些索引的负载不利。)
如果性能不是您主要考虑的问题,mysqldump实用程序非常有用,我会一直使用它。但是,如果你正在寻找一种非常快速的方法,我建议将实际的InnoDB文件从一个冷数据库复制到另一个冷数据库(假设它们是完全相同的MySQL版本,具有完全相同的配置和完全相同的预期行为等)。如果系统之间存在任何差异,这种方法很危险。
听起来,在您的情况下,您可能希望首先将好的数据复制到测试环境中。我的开发周期通常遵循这种方法:DDL通过编程从测试流向生产,DML通过实际使用系统从生产流向测试。
答案 5 :(得分: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 - >比较!