SlideShare a Scribd company logo
大規模 CSV を MySQL に入れる

       飯塚修平
この発表の目的
• ログデータ数年分を MySQL (RDS) に入れる。
 – 30万レコード/(日・テーブル) * 365 日/年 * 3 年 * 5 テーブル
   = 16 億レコードくらいの規模
 – とりあえず 1 年分だけでも入れたい・・・


• 今回の苦悩を紹介することで、今後同じようなタスクに
  取り組む人の参考にしてもらう。

• さらに良い方法があればぜひ紹介してください。
まず
• BULK INSERT で書いた
  – ウェブアプリで API のレスポンスを格納する時にはよく使う
      • Facebook の友人リストとか, 某の ID リストとか
  – INSERT INTO tbl VALUES (val,val,val), (val,val,val), (val ...
• 遅すぎ。
ので
• LOAD DATA INFILE で書いた
  – はやい!
  – 基本的に
    • “” あり→ VARCHAR, TEXT
    • “” なし→ INT, FLOAT
  – しかし、上手くやれば DATETIME 型に対応したり、文字列処理
    しながら入れることも可能
たとえば
• こんな CSV
  – “セッションID”, “Page”, “タイムスタンプ”, “Page Views”
  – "10000339141949907327:6","1","2011/01/01 12:10:27",1


• こんな テーブル
  –   session_id VARCHAR(100) NOT NULL
  –   session_num INTEGER(11) NOT NULL
  –   to_page INTEGER(11) NOT NULL
  –   timestamp DATETIME NOT NULL
  –   page_view INTEGER(11) NOT NULL
       • ちなみに、NOT NULL をつけていないカラムをキーにして走査するとパフォーマン
         スが落ちる。参考 http://www.mysqlperformanceblog.com/2007/04/10/count-vs-
         countcol/
ならばこんなかんじ

LOAD DATA LOCAL INFILE „hoge.csv‟ # RDS の場合 LOCAL が必要
REPLACE INTO TABLE tbl                # REPLACE か IGNORE
CHARACTER SET utf8
FIELDS TERMINATED BY „,‟              # CSV なので
OPTIONALLY ENCLOSED BY „“‟                 # “”囲みなので
IGNORE 1 LINES                             # 先頭行は無視する
(@var1, to_page, @var2, page_view)
SET
session_id = SUBSTRING(@var1, 1, LOCATE(':', @var1)-1), session_num =
SUBSTRING(@var1, LOCATE(':', @var1)+1),
timestamp = STR_TO_DATE(@var2, '%Y/%m/%d %H:%i:%s‟);
“10000339141949907327:6” → “10000339141949907327”, 6
DATETIME の型を指定する



参考 http://kedar.nitty-witty.com/blog/load-delimited-data-csv-excel-into-mysql-server
InnoDB か MyISAM か
• とりあえず InnoDB?
  ◯ トランザクション対応
      • ウェブサービスでは必須
  ◯ 行ロック
  ✕ データサイズが大きい
      • MyISAM の 2~3 倍
  ✕ 構造が複雑
• MyISAMを使うことに。
  ◯ SELECT COUNT(*) が異様に速い
      • InnoDB → type=INDEX, MyISAM → type=NULL
      • 参考 http://opendatabaselife.blogspot.jp/2009/10/myisaminnodb.html
  ✕ テーブルロック
• バッチ、SELECT 中心なら MyISAM がいいかも
• ウェブで使うなら InnoDB
  – 参考 http://nippondanji.blogspot.jp/2009/02/myisaminnodb.html
高速化のために
• EXPLAIN をつかってチューニング
    – select_type → type の順にチューニング
• できるだけ SUBQUERY はつかわない
    – SELECT ... WHERE IN (SELECT ...) みたいなやつ
    – 基本的に LEFT JOIN で書き換えられるはず
    – select_type = SINPLE を目指す
         • 具体的なことは・・・
           http://nippondanji.blogspot.jp/2009/03/mysql_25.html
• INDEX で絞る
    – type = ALL(フルテーブルスキャン)または
      type = INDEX(フルインデックススキャン)は要改善。
• key_len が短くなるように
    – UTF-8 の場合、 “123” は 9, 123 は 3

参考 http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
RDS のインスタンスと書き込み速度




    small   medium
まとめ
• 基本的に InnoDB。しかし、書き込みをしない、全文検
  索したいなど、特別な状況では MyISAM を検討しても
  よい。

• LOAD DATA INFILE 構文のオプションを使いこなせば、
  大抵のことはできる。

• 無駄なく適切なデータ型でスキームを書くべし。

• 高速化のためには EXPLAIN でチューニングを行うべ
  し。

More Related Content

PDF
PostgreSQL:行数推定を読み解く
Hiroya Kabata
 
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
 
PDF
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
Trainocate Japan, Ltd.
 
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
PPTX
iostat await svctm の 見かた、考え方
歩 柴田
 
PDF
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
PDF
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL:行数推定を読み解く
Hiroya Kabata
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
Trainocate Japan, Ltd.
 
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
iostat await svctm の 見かた、考え方
歩 柴田
 
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 

What's hot (20)

PDF
MroongaとPGroonga
Kouhei Sutou
 
PDF
クラウド環境下におけるAPIリトライ設計
Kouji YAMADA
 
PDF
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 
PDF
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
Satoshi Yamada
 
PDF
webエンジニアのためのはじめてのredis
nasa9084
 
PPT
UnicodeによるXSSと SQLインジェクションの可能性
Hiroshi Tokumaru
 
PDF
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
 
PDF
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
NTT DATA Technology & Innovation
 
PDF
イマドキ!ユースケース別に見るAWS IoT への接続パターン
seiichi arai
 
PDF
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
Seongyun Byeon
 
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
 
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
KEY
MAP 実装してみた
Masakazu Asama
 
PDF
PostgreSQLでスケールアウト
Masahiko Sawada
 
PDF
PostgreSQL運用管理入門
Yoshiyuki Asaba
 
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
 
PDF
10 Adımda Sızma Testleri
BGA Cyber Security
 
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PDF
Custom DevOps Monitoring System in MelOn (with InfluxDB + Telegraf + Grafana)
Seungmin Yu
 
MroongaとPGroonga
Kouhei Sutou
 
クラウド環境下におけるAPIリトライ設計
Kouji YAMADA
 
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
Satoshi Yamada
 
webエンジニアのためのはじめてのredis
nasa9084
 
UnicodeによるXSSと SQLインジェクションの可能性
Hiroshi Tokumaru
 
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
NTT DATA Technology & Innovation
 
イマドキ!ユースケース別に見るAWS IoT への接続パターン
seiichi arai
 
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
Seongyun Byeon
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
MAP 実装してみた
Masakazu Asama
 
PostgreSQLでスケールアウト
Masahiko Sawada
 
PostgreSQL運用管理入門
Yoshiyuki Asaba
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
 
10 Adımda Sızma Testleri
BGA Cyber Security
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
Custom DevOps Monitoring System in MelOn (with InfluxDB + Telegraf + Grafana)
Seungmin Yu
 
Ad

Similar to 大規模CSVをMySQLに入れる (20)

PDF
MySQL 5.5 Update #denatech
Mikiya Okuno
 
PDF
Logをs3とredshiftに格納する仕組み
Ken Morishita
 
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
Masahiro Nagano
 
PDF
ペパボ de MySQL
yoku0825
 
PPTX
いまいまMySQL@OSC2016長岡
sakaik
 
PPT
MySQL最新情報と、データベースのお勉強のススメ-第68回PHP勉強会
sakaik
 
PPTX
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
Ryusuke Kajiyama
 
PDF
ioDrive+MySQL勉強会
takaoka susumu
 
PPTX
【基礎編】社内向けMySQL勉強会
Yuji Otani
 
PDF
LINEのMySQL運用について
LINE Corporation
 
PDF
My sql casual12lt
Meiji Kimura
 
PDF
MySQL勉強会 インデックス編.2013 08-02
CROOZ, inc.
 
PPT
Maatkit で MySQL チューニング
Kensuke Nagae
 
PPT
Online schema change_for_mysql_casual
Naritoshi Hayashi
 
PDF
Japan.r 2データベース
sleipnir002
 
PDF
MySQL最新情報
yoyamasaki
 
PPTX
LINEのMySQL運用について 修正版
LINE Corporation
 
PDF
MySQL(RDB)入門 => PHPでアクセス
Kimiyuki Yamauchi
 
KEY
道具を磨くことのススメ
Kenichi Masuda
 
PDF
MySQLステータスモニタリング
yoku0825
 
MySQL 5.5 Update #denatech
Mikiya Okuno
 
Logをs3とredshiftに格納する仕組み
Ken Morishita
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
Masahiro Nagano
 
ペパボ de MySQL
yoku0825
 
いまいまMySQL@OSC2016長岡
sakaik
 
MySQL最新情報と、データベースのお勉強のススメ-第68回PHP勉強会
sakaik
 
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
Ryusuke Kajiyama
 
ioDrive+MySQL勉強会
takaoka susumu
 
【基礎編】社内向けMySQL勉強会
Yuji Otani
 
LINEのMySQL運用について
LINE Corporation
 
My sql casual12lt
Meiji Kimura
 
MySQL勉強会 インデックス編.2013 08-02
CROOZ, inc.
 
Maatkit で MySQL チューニング
Kensuke Nagae
 
Online schema change_for_mysql_casual
Naritoshi Hayashi
 
Japan.r 2データベース
sleipnir002
 
MySQL最新情報
yoyamasaki
 
LINEのMySQL運用について 修正版
LINE Corporation
 
MySQL(RDB)入門 => PHPでアクセス
Kimiyuki Yamauchi
 
道具を磨くことのススメ
Kenichi Masuda
 
MySQLステータスモニタリング
yoku0825
 
Ad

More from Shuhei Iitsuka (20)

PDF
Online and offline handwritten chinese character recognition a comprehensive...
Shuhei Iitsuka
 
PDF
Inferring win–lose product network from user behavior
Shuhei Iitsuka
 
PPTX
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
Shuhei Iitsuka
 
PDF
Procedural modeling using autoencoder networks
Shuhei Iitsuka
 
PDF
Generating sentences from a continuous space
Shuhei Iitsuka
 
PDF
ウェブサイト最適化のためのバリエーション自動生成システム
Shuhei Iitsuka
 
PDF
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Shuhei Iitsuka
 
PPTX
Machine learning meets web development
Shuhei Iitsuka
 
PDF
Python と Xpath で ウェブからデータをあつめる
Shuhei Iitsuka
 
PDF
リミックスからはじめる DTM 入門
Shuhei Iitsuka
 
PDF
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
Shuhei Iitsuka
 
PDF
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Shuhei Iitsuka
 
PDF
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
Shuhei Iitsuka
 
PDF
UT Startup Gym で人生が変わった話
Shuhei Iitsuka
 
PPTX
ウェブサイトで収益を得る
Shuhei Iitsuka
 
PPTX
HTML で自己紹介ページをつくる
Shuhei Iitsuka
 
PDF
データベースを使おう
Shuhei Iitsuka
 
PDF
ウェブサービスの企画とデザイン
Shuhei Iitsuka
 
PDF
データベースを使おう
Shuhei Iitsuka
 
PDF
第3期キックオフ説明会+勉強会
Shuhei Iitsuka
 
Online and offline handwritten chinese character recognition a comprehensive...
Shuhei Iitsuka
 
Inferring win–lose product network from user behavior
Shuhei Iitsuka
 
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
Shuhei Iitsuka
 
Procedural modeling using autoencoder networks
Shuhei Iitsuka
 
Generating sentences from a continuous space
Shuhei Iitsuka
 
ウェブサイト最適化のためのバリエーション自動生成システム
Shuhei Iitsuka
 
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Shuhei Iitsuka
 
Machine learning meets web development
Shuhei Iitsuka
 
Python と Xpath で ウェブからデータをあつめる
Shuhei Iitsuka
 
リミックスからはじめる DTM 入門
Shuhei Iitsuka
 
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
Shuhei Iitsuka
 
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Shuhei Iitsuka
 
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
Shuhei Iitsuka
 
UT Startup Gym で人生が変わった話
Shuhei Iitsuka
 
ウェブサイトで収益を得る
Shuhei Iitsuka
 
HTML で自己紹介ページをつくる
Shuhei Iitsuka
 
データベースを使おう
Shuhei Iitsuka
 
ウェブサービスの企画とデザイン
Shuhei Iitsuka
 
データベースを使おう
Shuhei Iitsuka
 
第3期キックオフ説明会+勉強会
Shuhei Iitsuka
 

大規模CSVをMySQLに入れる

  • 1. 大規模 CSV を MySQL に入れる 飯塚修平
  • 2. この発表の目的 • ログデータ数年分を MySQL (RDS) に入れる。 – 30万レコード/(日・テーブル) * 365 日/年 * 3 年 * 5 テーブル = 16 億レコードくらいの規模 – とりあえず 1 年分だけでも入れたい・・・ • 今回の苦悩を紹介することで、今後同じようなタスクに 取り組む人の参考にしてもらう。 • さらに良い方法があればぜひ紹介してください。
  • 3. まず • BULK INSERT で書いた – ウェブアプリで API のレスポンスを格納する時にはよく使う • Facebook の友人リストとか, 某の ID リストとか – INSERT INTO tbl VALUES (val,val,val), (val,val,val), (val ... • 遅すぎ。
  • 4. ので • LOAD DATA INFILE で書いた – はやい! – 基本的に • “” あり→ VARCHAR, TEXT • “” なし→ INT, FLOAT – しかし、上手くやれば DATETIME 型に対応したり、文字列処理 しながら入れることも可能
  • 5. たとえば • こんな CSV – “セッションID”, “Page”, “タイムスタンプ”, “Page Views” – "10000339141949907327:6","1","2011/01/01 12:10:27",1 • こんな テーブル – session_id VARCHAR(100) NOT NULL – session_num INTEGER(11) NOT NULL – to_page INTEGER(11) NOT NULL – timestamp DATETIME NOT NULL – page_view INTEGER(11) NOT NULL • ちなみに、NOT NULL をつけていないカラムをキーにして走査するとパフォーマン スが落ちる。参考 http://www.mysqlperformanceblog.com/2007/04/10/count-vs- countcol/
  • 6. ならばこんなかんじ LOAD DATA LOCAL INFILE „hoge.csv‟ # RDS の場合 LOCAL が必要 REPLACE INTO TABLE tbl # REPLACE か IGNORE CHARACTER SET utf8 FIELDS TERMINATED BY „,‟ # CSV なので OPTIONALLY ENCLOSED BY „“‟ # “”囲みなので IGNORE 1 LINES # 先頭行は無視する (@var1, to_page, @var2, page_view) SET session_id = SUBSTRING(@var1, 1, LOCATE(':', @var1)-1), session_num = SUBSTRING(@var1, LOCATE(':', @var1)+1), timestamp = STR_TO_DATE(@var2, '%Y/%m/%d %H:%i:%s‟); “10000339141949907327:6” → “10000339141949907327”, 6 DATETIME の型を指定する 参考 http://kedar.nitty-witty.com/blog/load-delimited-data-csv-excel-into-mysql-server
  • 7. InnoDB か MyISAM か • とりあえず InnoDB? ◯ トランザクション対応 • ウェブサービスでは必須 ◯ 行ロック ✕ データサイズが大きい • MyISAM の 2~3 倍 ✕ 構造が複雑 • MyISAMを使うことに。 ◯ SELECT COUNT(*) が異様に速い • InnoDB → type=INDEX, MyISAM → type=NULL • 参考 http://opendatabaselife.blogspot.jp/2009/10/myisaminnodb.html ✕ テーブルロック • バッチ、SELECT 中心なら MyISAM がいいかも • ウェブで使うなら InnoDB – 参考 http://nippondanji.blogspot.jp/2009/02/myisaminnodb.html
  • 8. 高速化のために • EXPLAIN をつかってチューニング – select_type → type の順にチューニング • できるだけ SUBQUERY はつかわない – SELECT ... WHERE IN (SELECT ...) みたいなやつ – 基本的に LEFT JOIN で書き換えられるはず – select_type = SINPLE を目指す • 具体的なことは・・・ http://nippondanji.blogspot.jp/2009/03/mysql_25.html • INDEX で絞る – type = ALL(フルテーブルスキャン)または type = INDEX(フルインデックススキャン)は要改善。 • key_len が短くなるように – UTF-8 の場合、 “123” は 9, 123 は 3 参考 http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
  • 10. まとめ • 基本的に InnoDB。しかし、書き込みをしない、全文検 索したいなど、特別な状況では MyISAM を検討しても よい。 • LOAD DATA INFILE 構文のオプションを使いこなせば、 大抵のことはできる。 • 無駄なく適切なデータ型でスキームを書くべし。 • 高速化のためには EXPLAIN でチューニングを行うべ し。