mysql データ分割入門
TRANSCRIPT
MySQL データ分割入門
mysql-casual#1 (2010-12-10)@xaicron
2010年12月13日月曜日
自己紹介
• @xaicron (さいくろん)
• works at DeNA
• blog http://blog.livedoor.jp/xaicron/
2010年12月13日月曜日
普段は Perl とか書いてます
2010年12月13日月曜日
JPerl Advent Calenderやってるので
2010年12月13日月曜日
よかったら参加してください!
2010年12月13日月曜日
http://perl-users.jp/articles/advent-calendar/help.html
2010年12月13日月曜日
宣伝終わり
2010年12月13日月曜日
僕の MySQL レベル
2010年12月13日月曜日
★☆☆☆☆☆☆☆☆☆☆
2010年12月13日月曜日
未満
2010年12月13日月曜日
超初心者なのに
2010年12月13日月曜日
なぜか呼ばれました
2010年12月13日月曜日
主催のmyfinderさんの目の前に座ってるから
ですね
2010年12月13日月曜日
お手柔らかにお願いします
2010年12月13日月曜日
でcv. 伊藤かな恵
2010年12月13日月曜日
Agenda
• Sharding について
• Partitioning について
2010年12月13日月曜日
Sharding
2010年12月13日月曜日
Sharding とは
• Shared Nothing アーキテクチャー
• 複数の DB に データを分割すること
2010年12月13日月曜日
例えばuser_id で分割
2010年12月13日月曜日
2010年12月13日月曜日
Sharding の利点
2010年12月13日月曜日
物理サーバーレベルでDBが分かれるので
処理速度の向上が見込める
2010年12月13日月曜日
例えば
• 2分割であれば、アクセス自体が半減
• Disk や IO に余裕ができる
•メモリに乗り切らなかったデータが乗るようになる
2010年12月13日月曜日
Sharding の注意点
2010年12月13日月曜日
• ノードが違うので 当然 JOIN できない
•シーケンスを外だしする必要がある
• プログラムが冗長になりがち
• そもそも物理サーバーが必要 orz
2010年12月13日月曜日
シーケンスの外だしする必要がある
2010年12月13日月曜日
user_id などは、auto_increment で発番したいところだけど、
物理的に別の DB にあるので出来ない
2010年12月13日月曜日
別の DB に シーケンス発行用のテーブルを作る必要が
ある
2010年12月13日月曜日
まとめ
2010年12月13日月曜日
• メモリに乗り切らなかったデータも乗るようになる(かも)ので超うれしい
• ただし、いろいろと制約があるので、構造上できないこともある
• そもそも物理サーバーが買えないとダメです><
• プログラムも若干面倒
2010年12月13日月曜日
Partitioning
2010年12月13日月曜日
Partitioning
• 特定の条件で、テーブルのデータ自体を分割して管理することができる
• 刈り込みで SELECT 性能が良くなったり、Partition 単位で drop したり
• 5.1 系で --with-partition したら使える
2010年12月13日月曜日
例えば日付で分割
2010年12月13日月曜日
2010年12月13日月曜日
Partitioning の利点
2010年12月13日月曜日
• 物理的にテーブルを分割するので、複数のディスクに保存することが可能(ディスクサイズを超えるデータの保持)
• 不要になった Partition を超高速に(ほぼ一瞬)で削除できる
• Partition の刈り込みで SELECT 性能が向上
• SUM() や COUNT() が並列実行されるため高速になる
• 書き込み性能があがる
2010年12月13日月曜日
秘技
2010年12月13日月曜日
ALTER TABLEtable_name
DROP PARTITIONS!!
2010年12月13日月曜日
効果指定した Partition が虚空の
彼方に消える
2010年12月13日月曜日
不要になったデータを一瞬で消すことが出来るので
超便利です
2010年12月13日月曜日
刈り込み とは
2010年12月13日月曜日
SELECT 時に特定のPartition が選択されるよう
にすること
2010年12月13日月曜日
例えば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日月曜日
のように日付で分割されていて、かつ 20101210 しか
欲しくない場合
2010年12月13日月曜日
SELECT * FROM tweet WHERE created_on > ‘20101210’ AND tweet = ‘mysqlcasual’;
2010年12月13日月曜日
とすると、p20101210 が選択され、ほかの partition を無視するので高速になる
2010年12月13日月曜日
EXPLAIN PARTITION SELECT ... するとどの partition が選択されている
かわかります
2010年12月13日月曜日
Partitioning の注意点
2010年12月13日月曜日
• PARTITION の KEY (さっきの例だと created_on) は Primary Key 相当になる
• UNIQ や 外部キー制約が出来ない
• 刈り込みの効かない SELECT は遅くなる可能性がある
• UNIX_TIMESTAMP() で切りたい場合は v5.1.43 以上が必要(時間単位で切れるようになる!!)
2010年12月13日月曜日
まとめ
2010年12月13日月曜日
• 不要になったデータを簡単に消せるので、メモリにのせられる!
• 新しめの MySQL じゃないとダメ><
• 運用がめんどくさくなる(日付で切ったりとかだと、追加と削除を cron でまわしたり)
• でも用途にマッチすれば熱い!!
2010年12月13日月曜日
でcv. 伊藤かな恵
2010年12月13日月曜日
Sharding と Partitioning
は併用できます!!
2010年12月13日月曜日
なので、うまくデータを分割して、処理性能をあげましょう!!
2010年12月13日月曜日
適切にデータを分割すれば
2010年12月13日月曜日
全部メモリにのせることも夢じゃない!
2010年12月13日月曜日
ご清聴ありがとうございました
2010年12月13日月曜日