SlideShare a Scribd company logo
1 of 42
MySQLで2億件のシリアルデータと
格闘したチューニングの話
YAPC::Asia Tokyo 2015
Kenji Saito / @saiken3110
自己紹介
・斉藤 健二 Kenji Saito
・@saiken3110
・Java PHP Perl
・Oracle MySQL
今日の内容
MySQLで
2億件のシリアルデータを
つかった話
主にチューニングの話です。
Perlも最後にちょっとでてきます。。
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・まとめ
システムの概要(フロント)
商品購入
シリアル入力
入力
・商品A
・サイズ
商品サイズ選択
登録
XXL ▼
商品シリアル
紐付
利用履歴
システムの概要(バックエンド)
シリアルマスタ
商品名
シリアル数
商品・シリアル紐付け
紐付け
▼
商品シリアル
紐付
2億件!! 1億件!!
・Red Hat 5.6
・Perl 5.20
・MySQL 5.6
DBサーバのインフラ事情①
・CPU 2コア
・メモリ 8G
・ディスク 450G
・/tmp 2G
DBサーバのインフラ事情②
→ 2コア、8G。。。2億件。。。
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・まとめ
□対象テーブル
・シリアルマスタ(2億件)
・商品シリアル紐付(1億件)
□内容
・インデックスを使った検索
・プライマリーキーでの検索
・フルスキャンでの検索
・フルスキャンでのcount
・フルスキャンでのorder by
・insert
・alter table (カラム追加)
負荷テスト
いろいろと問題が・・・
○count に84秒、CPUを80 ~ 95 %使用
→ アプリケーションからは
実行しないため、対応不要とした
○order by や alter で/tmp が枯渇
→ tmp_dir を物理ディスクに変更
→ エラーがでなくなったが、
50Gくらい一時領域を使ってた。。
→ 運用で回避することにした
負荷テスト 結果①
ERROR 3 (HY000) at line 1: Error writing file '/tmp/MY3p25s8' (Errcode: 28 -
No space left on device)
○商品シリアル紐付のデータファイルが28Gに。。
→ パフォーマンスのために、
各レコードで商品情報を持っていたのをやめた
→ 管理用のTBLを作り、
正規化、15G に縮小!
○insertが意外と早い
「LOAD DATA」で3億件の登録が70分
→ 後でいろいろ問題が発生。。
負荷テスト 結果②
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・まとめ
2億件登録したときの話①
シリアルマスタ
商品名
シリアル数
商品・シリアル紐付け
紐付け
▼
商品シリアル
紐付
2億件!! 1億件!!
ココ
負荷テストのときに、3億件が70分で登録できた
実際のデータで2億件登録しようとしたら、、
75時間かかった。。
2億件登録したときの話②
□実行時間の推移
2億件登録したときの話③
※500万件ずつ「LODA DATA」で登録
8000万件から
急激に遅延
□負荷テストのときより遅くなった原因
→ 負荷テストのときはシリアルが連番
実際は、ランダムな数字
→ insert 時にindex の再作成が発生!
□8000万件くらいから急激に遅くなった原因
→ innodb_buffer_pool が枯渇
→ 検証してみた
2億件登録したときの話④
innodb_buffer_pool とinsert①
さすがに75時間を何度もは無理なので、
innodb_buffer_pool_size を10分の1くらいで
試してみた
40時間くらいかけて。。
innodb_buffer_pool とinsert②
innodb_buffer_pool_size を1G、500M、250Mで
10万件のinsert × 100回にかかる時間を計測
250M で実行した場合、
340万件から遅延が発生
500M で実行した場合、
700万件から遅延が発生
innodb_buffer_pool とinsert③
データ量(登録件数)が増加し、
innodb_buffer_pool が枯渇すると、
insert が大幅に遅延し始める。
→ メモリからあふれて、
ディスクI/Oが発生しているため。
→ メモリを増やすことで、
データ量が多くても遅延が発生しない
ついでに、、
主キーがシーケンスなら
インデックスの再構築が
早いんじゃないかと思った
試してみた
再びの40時間。。
主キーとinsert①
主キーをシリアル(ランダムな数字)から
シーケンスに変更して、2億件の登録にかかる時間を比較
○変更前
・主キー:シリアル
・ユニークキー:シーケンス
○変更後
・主キー:シーケンス
・ユニークキー:シリアル
主キーとinsert②
○2億件の登録にかかった時間
75時間 → 30時間に改善!
→ 主キーが連番になったことで、
主キーのインデックス構築にかかる時間が減少
変更前は2億件の登録に
約75時間
変更後は2億件の登録が
約30時間で完了
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・その他 Perlのチューニング
・まとめ
updateではまった話①
シリアルマスタ
商品名
シリアル数
商品・シリアル紐付け
紐付け
▼
商品シリアル
紐付
2億件!! 1億件!!
ココ
負荷テストのときは、
100万件の紐付が74秒だった
お客さんの前でデモしたら、、
1時間かかった
updateではまった話②
updateではまった話③
□アプリケーションの動き
※1回のmaxが 100万件で1万件ごとにコミット
1)シリアルマスタからステータスが
「未使用」のものを取得
2)商品シリアル紐付へ、
入力した商品の情報をつけてシリアルをinsert
3)シリアルマスタのステータスを「使用済み」にupdate
→ 1回のupdate で35秒かかっていた
→ 100万件の場合、35秒×100回!
updateではまった話④
□update が遅かった原因
→ update 時にindex の再構築が発生
→ シリアルがランダムなため、
紐付く主キーの読込みが重い。。
read_buffer_size (16k)ずつ
読み込まれる
紐付く主キーがバラバラなた
め、読込が毎回発生
updateではまった話⑤
□対応
ステータス管理をやめ、
管理テーブルを作成し、
update 自体を不要にした
→ 60分が45秒に改善!
→ インデックスの再構築怖い。。。
そんなこんなで、
なんとか無事リリースできました
よかった
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・その他 Perlのチューニング
・まとめ
今後の課題①
□増分バックアップ
現状mysqldump でフルバックアップ
→ 今後さらにデータが増えてくると、
バイナリログを使った
増分バックアップの方がよさそう
今後の課題②
□データ退避とかパーティショニング
→ 古いシリアルの退避とか、
できれば「xxxx_2015」とか作りたくないので、
うまくパーティションとか使えると。。
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・その他 Perlのチューニング
・まとめ
その他 Perlのチューニング①
□コネクションプーリングっぽいこと
コネクションオブジェクトを
シングルトンにし、1worker 1コネクションを共有
→ コネクション生成のコストをなくした
その他 Perlのチューニング②
□マスタデータをキャッシュ
PSGIサーバ起動時に、メモリにDBのマスタデータを保持
→ worker 内でメモリは共有されるため、
DBアクセスが不要になる
※ただし、「Copy-On-Write」なので、
書き換えようとすると、メモリリークの原因になる
※ただし、マスタデータを変更する場合には、
再起動が必要になるので、
本当はmemcached とかを使った方がよさそう
まとめ①
□innodb_buffer_pool_size は大きい方がいい
□主キーはシーケンスにした方がinsert が早い
□インデックスの再構築は意外とばかにならない
まとめ②
□負荷テスト大事
実際のデータに近いデータでやる
□結局計測してみないとわからないことは多い
→ 効果測定にすごく時間がかかるので、
負荷テストとかは、早めにやる
ありがとうございました!

More Related Content

What's hot

What's hot (20)

「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 

Similar to My sqlで2億件のシリアルデータと格闘した話

20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
Takahiro Iwase
 

Similar to My sqlで2億件のシリアルデータと格闘した話 (20)

LINEのMySQL運用について
LINEのMySQL運用についてLINEのMySQL運用について
LINEのMySQL運用について
 
ついにリリース!! MySQL 8.0 最新情報
ついにリリース!! MySQL 8.0 最新情報ついにリリース!! MySQL 8.0 最新情報
ついにリリース!! MySQL 8.0 最新情報
 
2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習
 
States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -
 
Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介
 
Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介
 
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
 
MBAAで覚えるDBREの大事なおしごと
MBAAで覚えるDBREの大事なおしごとMBAAで覚えるDBREの大事なおしごと
MBAAで覚えるDBREの大事なおしごと
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!
 
第九回中国地方DB勉強会 in 米子 MySQL 5.7+
第九回中国地方DB勉強会 in 米子 MySQL 5.7+第九回中国地方DB勉強会 in 米子 MySQL 5.7+
第九回中国地方DB勉強会 in 米子 MySQL 5.7+
 
20210907 Qlik Tech Talk Snowflake with Qlik Best Practices
20210907 Qlik Tech Talk Snowflake with Qlik Best Practices20210907 Qlik Tech Talk Snowflake with Qlik Best Practices
20210907 Qlik Tech Talk Snowflake with Qlik Best Practices
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
 
MariaDB 10.3 概要
MariaDB 10.3 概要 MariaDB 10.3 概要
MariaDB 10.3 概要
 
MySQL Binlog Events でストリーム処理してみた #MySQLUC15
MySQL Binlog Events でストリーム処理してみた #MySQLUC15MySQL Binlog Events でストリーム処理してみた #MySQLUC15
MySQL Binlog Events でストリーム処理してみた #MySQLUC15
 
Developers.IO 2019 Effective Datalake
Developers.IO 2019 Effective DatalakeDevelopers.IO 2019 Effective Datalake
Developers.IO 2019 Effective Datalake
 
MySQL最新情報
MySQL最新情報MySQL最新情報
MySQL最新情報
 
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
 
データサイエンティスト協会 木曜勉強会 #02 講演2:『ビッグデータの0次分析手法と適用例のご紹介 ~俯瞰から始まる企業内ビッグデータの活用~』
データサイエンティスト協会 木曜勉強会 #02 講演2:『ビッグデータの0次分析手法と適用例のご紹介 ~俯瞰から始まる企業内ビッグデータの活用~』データサイエンティスト協会 木曜勉強会 #02 講演2:『ビッグデータの0次分析手法と適用例のご紹介 ~俯瞰から始まる企業内ビッグデータの活用~』
データサイエンティスト協会 木曜勉強会 #02 講演2:『ビッグデータの0次分析手法と適用例のご紹介 ~俯瞰から始まる企業内ビッグデータの活用~』
 
OSC2017 Hokkaido. MySQL今こそインストールを極めよう~改めて考える環境構築~
OSC2017 Hokkaido. MySQL今こそインストールを極めよう~改めて考える環境構築~OSC2017 Hokkaido. MySQL今こそインストールを極めよう~改めて考える環境構築~
OSC2017 Hokkaido. MySQL今こそインストールを極めよう~改めて考える環境構築~
 

Recently uploaded

Recently uploaded (10)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

My sqlで2億件のシリアルデータと格闘した話