2011-01-20 12 views
8

私は自分の開発データベースに取り組んでおり、そのパフォーマンスを調整しました。MySql、開発データベースから本番データベースにインデックスをエクスポートするにはどうしたらいいですか?

しかし、驚いたことに、インデックスを本番データベースにエクスポートする方法を見つけることができません。

私はこれを行う簡単な方法があると思いました。私は本番データベースのデータを置き換えたくありません。

主な問題は、インデックス内で並べ替えがわからないため、手動で行うことも難しいことです。

答えて

10

おそらく、「私の(既存の)ライブデータベースに開発インデックスを再作成するにはどうすればいいですか?

もしそうなら、探しているSQLコマンドがあると思います。

SHOW CREATE TABLE {tablename};

ALTER TABLE INDEX {INDEX_NAME}(COL1、COL2)

ALTER TABLE DROP INDEX {INDEX_NAME}

あなたは、 "キー" とから "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; 

希望します。

3

まず、how-to Export MySQL Indexes using a SQL queryのチュートリアルを読んでください。さらに:

  1. あなたのデータベースの完全なダンプを行うと(PHPMyAdminの、などを使用して)別のものにそれをインポートする場合は、インデックスが再生成されます。

  2. 可能であれば、MySQLデータベースフォルダ全体の内容を運用データベースにコピーできます。これはやりすぎです。 Read more here at MySQL docs.

1

あなたは

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

とインデックスが自動的にコピーされますダンプを取るために、次のコマンドを使用することができます。

1

私はあなた自身がインデックスをエクスポートしようとしていると思いますが、実際にプロダクションでコードを再生成するコードだけではありません。 (私は、これらのインデックスを生成する負荷がほとんどの実動環境ではうまくいかないため、これを仮定しています)。

mysqldumpユーティリティは、パフォーマンスが重要な問題ではない場合に便利です。しかし、非常に高速な方法を探しているなら、実際のInnoDBファイルを1つのコールドデータベースから別のコールドデータベースにコピーすることをお勧めします(まったく同じMySQLバージョンで、まったく同じ設定で、行動など)。システム間に相違がある場合、この方法は危険です。

まず、適切なデータをテスト環境にコピーしたいと思うかもしれません。私の開発サイクルは、典型的にはこのアプローチに従っています.DDLはテストからプロダクションを経てプロダクションに流れ、DMLはプロダクションからシステムの実際の使用を通してテストに流れます。

+3

このコメントに属し、代わりに仮定の答えを提供してください。 – Tom

1

同じデータベース構造の開発サーバーと本番サーバーもあります。

私は両方のインデックスを修正しましたので、私はすべて一緒にマージしたいと思っていました。だから私はメモ帳+とデータを比較する必要があった。ここで

は、あなたがすべてのテーブルのインデックスをエクスポートする方法ですすべてのデータベースとどのようにそれらをフィルタリングし、比較するには:

--- 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"のままにしておきます。

データベースでフィルタリングします。

すべてをデータベース1からメモ帳+画面1にコピーし、データベース2をフィルター処理し、すべてをメモ帳+画面2にコピーします。

0

@ 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; 
関連する問題