MySQLへCSVファイルからデータを移行しようとしています(テーブルはInnoDBを使用)。insert文とload文ではload文を用いた方が早いとマニュアルにあり、試したところ実際その通りになりました。また、データを移行後にプライマリーキーをつけるか、プライマリーキーがすでについたテーブルにデータをロードするかを試したところ、プライマリーキー付きのテーブルへのロードの方が速いようでした。会社の古株の先輩が、大量のデータを移行するときはあとでインデックスをつけるものだ、と言っていたので、意外でした。さて、このインデックスの件について、マニュアルや実験例を探したのですが、見つかりませんでした。この件について知見をもたれているかたのご意見を伺いたく思います。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/06/06 08:02:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント100pt

大量のデータを移行するときはあとでインデックスをつけるものだ

基本的な考え方はその通り。ただし、提示の条件の場合以下の特有の条件がつく。


MySQL :: MySQL 4.1 リファレンスマニュアル :: 7.5.12 テーブルとインデックスの構造

すべての InnoDB テーブルには、クラスタードインデックスと呼ばれる、レコードのデータを格納する特別なインデックスがあります。テーブルで PRIMARY KEY を定義すると、主キーのインデックスがクラスタードインデックスになります。

テーブルに主キーを定義しない場合は、InnoDB によって内部的にクラスタードインデックスが作成され、そこで InnoDB がテーブル内のレコードに割り当てるロー ID の順にレコードが並べられます。

つまり、主キー無しで作成しても内部的にはそれと同等の物が作成される。


結果質問の条件では主キー相当のインデックスが2重に作成されることになり、PRIMARY KEY を後で追加した方が余分にコストがかかってしまうと思われる。

これは InnoDB 特有の現象なのでRDBMSの一般的な現象というわけではない。

id:javabenkyo

なるほど。ありがとうございます。

たしかに後からインデックスをつけたほうが総要領は大きくなるようでした。

2009/06/01 17:41:09

その他の回答1件)

id:QuestR2 No.1

回答回数435ベストアンサー獲得回数13

ポイント100pt

データがすでにソートされたデータであった場合、インデックスが着いていても、ロードは早くなります。

id:javabenkyo

なるほど。ありがとうございます。

元データがソートがなされていないとき、OSのコマンドで並べ替える必要があるため、結果は一概には言えなさそうですね。あした会社で検証してみます。

2009/05/31 18:54:03
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440ここでベストアンサー

ポイント100pt

大量のデータを移行するときはあとでインデックスをつけるものだ

基本的な考え方はその通り。ただし、提示の条件の場合以下の特有の条件がつく。


MySQL :: MySQL 4.1 リファレンスマニュアル :: 7.5.12 テーブルとインデックスの構造

すべての InnoDB テーブルには、クラスタードインデックスと呼ばれる、レコードのデータを格納する特別なインデックスがあります。テーブルで PRIMARY KEY を定義すると、主キーのインデックスがクラスタードインデックスになります。

テーブルに主キーを定義しない場合は、InnoDB によって内部的にクラスタードインデックスが作成され、そこで InnoDB がテーブル内のレコードに割り当てるロー ID の順にレコードが並べられます。

つまり、主キー無しで作成しても内部的にはそれと同等の物が作成される。


結果質問の条件では主キー相当のインデックスが2重に作成されることになり、PRIMARY KEY を後で追加した方が余分にコストがかかってしまうと思われる。

これは InnoDB 特有の現象なのでRDBMSの一般的な現象というわけではない。

id:javabenkyo

なるほど。ありがとうございます。

たしかに後からインデックスをつけたほうが総要領は大きくなるようでした。

2009/06/01 17:41:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません