SlideShare une entreprise Scribd logo
1  sur  10
大規模 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 でチューニングを行うべ
  し。

Contenu connexe

Tendances

Tendances (20)

Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
 
使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
BigQuery Query Optimization クエリ高速化編
BigQuery Query Optimization クエリ高速化編BigQuery Query Optimization クエリ高速化編
BigQuery Query Optimization クエリ高速化編
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
 
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
 
より深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニングより深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニング
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 

Similaire à 大規模CSVをMySQLに入れる

初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
Oonishi Takaaki
 

Similaire à 大規模CSVをMySQLに入れる (20)

いまいまMySQL@OSC2016長岡
いまいまMySQL@OSC2016長岡いまいまMySQL@OSC2016長岡
いまいまMySQL@OSC2016長岡
 
AWS Black Belt Tech シリーズ 2015 - Amazon Redshift
AWS Black Belt Tech シリーズ 2015 - Amazon RedshiftAWS Black Belt Tech シリーズ 2015 - Amazon Redshift
AWS Black Belt Tech シリーズ 2015 - Amazon Redshift
 
20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql
 
Babelfish Compatibility
Babelfish CompatibilityBabelfish Compatibility
Babelfish Compatibility
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
 
PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)
 
はじめてのAmazon Redshift
はじめてのAmazon RedshiftはじめてのAmazon Redshift
はじめてのAmazon Redshift
 
いまいまMySQL@OSC2016福岡
いまいまMySQL@OSC2016福岡いまいまMySQL@OSC2016福岡
いまいまMySQL@OSC2016福岡
 
お金をかけないDBチューニング
お金をかけないDBチューニングお金をかけないDBチューニング
お金をかけないDBチューニング
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門
 
MySQL SQL tuning
MySQL SQL tuningMySQL SQL tuning
MySQL SQL tuning
 
JSONB型でpostgresをNoSQLっぽく使う
JSONB型でpostgresをNoSQLっぽく使うJSONB型でpostgresをNoSQLっぽく使う
JSONB型でpostgresをNoSQLっぽく使う
 
初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
 
Qlik composeを利用したDWH構築の流れ
Qlik composeを利用したDWH構築の流れQlik composeを利用したDWH構築の流れ
Qlik composeを利用したDWH構築の流れ
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 

Plus de Shuhei Iitsuka

Inferring win–lose product network from user behavior
Inferring win–lose product network from user behaviorInferring win–lose product network from user behavior
Inferring win–lose product network from user behavior
Shuhei Iitsuka
 
ウェブサイトで収益を得る
ウェブサイトで収益を得るウェブサイトで収益を得る
ウェブサイトで収益を得る
Shuhei Iitsuka
 
第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会 第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会
Shuhei Iitsuka
 

Plus de Shuhei Iitsuka (20)

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

大規模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 でチューニングを行うべ し。