mysql データ分割入門

57

Click here to load reader

Upload: yuji-shimada

Post on 20-May-2015

4.035 views

Category:

Lifestyle


2 download

TRANSCRIPT

Page 1: MySQL データ分割入門

MySQL データ分割入門

mysql-casual#1 (2010-12-10)@xaicron

2010年12月13日月曜日

Page 2: MySQL データ分割入門

自己紹介

• @xaicron (さいくろん)

• works at DeNA

• blog http://blog.livedoor.jp/xaicron/

2010年12月13日月曜日

Page 3: MySQL データ分割入門

普段は Perl とか書いてます

2010年12月13日月曜日

Page 4: MySQL データ分割入門

JPerl Advent Calenderやってるので

2010年12月13日月曜日

Page 5: MySQL データ分割入門

よかったら参加してください!

2010年12月13日月曜日

Page 6: MySQL データ分割入門

http://perl-users.jp/articles/advent-calendar/help.html

2010年12月13日月曜日

Page 7: MySQL データ分割入門

宣伝終わり

2010年12月13日月曜日

Page 8: MySQL データ分割入門

僕の MySQL レベル

2010年12月13日月曜日

Page 9: MySQL データ分割入門

★☆☆☆☆☆☆☆☆☆☆

2010年12月13日月曜日

Page 10: MySQL データ分割入門

未満

2010年12月13日月曜日

Page 11: MySQL データ分割入門

超初心者なのに

2010年12月13日月曜日

Page 12: MySQL データ分割入門

なぜか呼ばれました

2010年12月13日月曜日

Page 13: MySQL データ分割入門

主催のmyfinderさんの目の前に座ってるから

ですね

2010年12月13日月曜日

Page 14: MySQL データ分割入門

お手柔らかにお願いします

2010年12月13日月曜日

Page 15: MySQL データ分割入門

でcv. 伊藤かな恵

2010年12月13日月曜日

Page 16: MySQL データ分割入門

Agenda

• Sharding について

• Partitioning について

2010年12月13日月曜日

Page 17: MySQL データ分割入門

Sharding

2010年12月13日月曜日

Page 18: MySQL データ分割入門

Sharding とは

• Shared Nothing アーキテクチャー

• 複数の DB に データを分割すること

2010年12月13日月曜日

Page 19: MySQL データ分割入門

例えばuser_id で分割

2010年12月13日月曜日

Page 20: MySQL データ分割入門

2010年12月13日月曜日

Page 21: MySQL データ分割入門

Sharding の利点

2010年12月13日月曜日

Page 22: MySQL データ分割入門

物理サーバーレベルでDBが分かれるので

処理速度の向上が見込める

2010年12月13日月曜日

Page 23: MySQL データ分割入門

例えば

• 2分割であれば、アクセス自体が半減

• Disk や IO に余裕ができる

•メモリに乗り切らなかったデータが乗るようになる

2010年12月13日月曜日

Page 24: MySQL データ分割入門

Sharding の注意点

2010年12月13日月曜日

Page 25: MySQL データ分割入門

• ノードが違うので 当然 JOIN できない

•シーケンスを外だしする必要がある

• プログラムが冗長になりがち

• そもそも物理サーバーが必要 orz

2010年12月13日月曜日

Page 26: MySQL データ分割入門

シーケンスの外だしする必要がある

2010年12月13日月曜日

Page 27: MySQL データ分割入門

user_id などは、auto_increment で発番したいところだけど、

物理的に別の DB にあるので出来ない

2010年12月13日月曜日

Page 28: MySQL データ分割入門

別の DB に シーケンス発行用のテーブルを作る必要が

ある

2010年12月13日月曜日

Page 29: MySQL データ分割入門

まとめ

2010年12月13日月曜日

Page 30: MySQL データ分割入門

• メモリに乗り切らなかったデータも乗るようになる(かも)ので超うれしい

• ただし、いろいろと制約があるので、構造上できないこともある

• そもそも物理サーバーが買えないとダメです><

• プログラムも若干面倒

2010年12月13日月曜日

Page 31: MySQL データ分割入門

Partitioning

2010年12月13日月曜日

Page 32: MySQL データ分割入門

Partitioning

• 特定の条件で、テーブルのデータ自体を分割して管理することができる

• 刈り込みで SELECT 性能が良くなったり、Partition 単位で drop したり

• 5.1 系で --with-partition したら使える

2010年12月13日月曜日

Page 33: MySQL データ分割入門

例えば日付で分割

2010年12月13日月曜日

Page 34: MySQL データ分割入門

2010年12月13日月曜日

Page 35: MySQL データ分割入門

Partitioning の利点

2010年12月13日月曜日

Page 36: MySQL データ分割入門

• 物理的にテーブルを分割するので、複数のディスクに保存することが可能(ディスクサイズを超えるデータの保持)

• 不要になった Partition を超高速に(ほぼ一瞬)で削除できる

• Partition の刈り込みで SELECT 性能が向上

• SUM() や COUNT() が並列実行されるため高速になる

• 書き込み性能があがる

2010年12月13日月曜日

Page 37: MySQL データ分割入門

秘技

2010年12月13日月曜日

Page 38: MySQL データ分割入門

ALTER TABLEtable_name

DROP PARTITIONS!!

2010年12月13日月曜日

Page 39: MySQL データ分割入門

効果指定した Partition が虚空の

彼方に消える

2010年12月13日月曜日

Page 40: MySQL データ分割入門

不要になったデータを一瞬で消すことが出来るので

超便利です

2010年12月13日月曜日

Page 41: MySQL データ分割入門

刈り込み とは

2010年12月13日月曜日

Page 42: MySQL データ分割入門

SELECT 時に特定のPartition が選択されるよう

にすること

2010年12月13日月曜日

Page 43: MySQL データ分割入門

例えばCREATE TABLE `tweet` ( `id` bigint(20) NOT NULL, `tweet` varchar(140) NOT NULL, `created_on` timestamp NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8PARTITION BY RANGE ( UNIX_TIMESTAMP(created_on) ) ( PARTITION p20101210 VALUE LESS THAN (1291906800), PARTITION p20101211 VALUE LESS THAN (1291993200), PARTITION p20101212 VALUE LESS THAN (1292079600), PARTITION p20101213 VALUE LESS THAN (1292166000), PARTITION p20101214 VALUE LESS THAN (1292252400)

2010年12月13日月曜日

Page 44: MySQL データ分割入門

のように日付で分割されていて、かつ 20101210 しか

欲しくない場合

2010年12月13日月曜日

Page 45: MySQL データ分割入門

SELECT * FROM tweet WHERE created_on > ‘20101210’ AND tweet = ‘mysqlcasual’;

2010年12月13日月曜日

Page 46: MySQL データ分割入門

とすると、p20101210 が選択され、ほかの partition を無視するので高速になる

2010年12月13日月曜日

Page 47: MySQL データ分割入門

EXPLAIN PARTITION SELECT ... するとどの partition が選択されている

かわかります

2010年12月13日月曜日

Page 48: MySQL データ分割入門

Partitioning の注意点

2010年12月13日月曜日

Page 49: MySQL データ分割入門

• PARTITION の KEY (さっきの例だと created_on) は Primary Key 相当になる

• UNIQ や 外部キー制約が出来ない

• 刈り込みの効かない SELECT は遅くなる可能性がある

• UNIX_TIMESTAMP() で切りたい場合は v5.1.43 以上が必要(時間単位で切れるようになる!!)

2010年12月13日月曜日

Page 50: MySQL データ分割入門

まとめ

2010年12月13日月曜日

Page 51: MySQL データ分割入門

• 不要になったデータを簡単に消せるので、メモリにのせられる!

• 新しめの MySQL じゃないとダメ><

• 運用がめんどくさくなる(日付で切ったりとかだと、追加と削除を cron でまわしたり)

• でも用途にマッチすれば熱い!!

2010年12月13日月曜日

Page 52: MySQL データ分割入門

でcv. 伊藤かな恵

2010年12月13日月曜日

Page 53: MySQL データ分割入門

Sharding と Partitioning

は併用できます!!

2010年12月13日月曜日

Page 54: MySQL データ分割入門

なので、うまくデータを分割して、処理性能をあげましょう!!

2010年12月13日月曜日

Page 55: MySQL データ分割入門

適切にデータを分割すれば

2010年12月13日月曜日

Page 56: MySQL データ分割入門

全部メモリにのせることも夢じゃない!

2010年12月13日月曜日

Page 57: MySQL データ分割入門

ご清聴ありがとうございました

2010年12月13日月曜日