Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

My sqlカジュアル パーティショニング

3,098 views

Published on

http://atnd.org/events/28568 の発表内容です。
↓ 実演中に紹介したスクリプト
--------


■新規テーブル作成時

CREATE TABLE `battle_result` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`player_id` varchar(255) NOT NULL,
`opponent_id` varchar(255) NOT NULL,
`result` int(11) NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) PARTITION BY RANGE(id) (
PARTITION p01 VALUES LESS THAN (10),
PARTITION p02 VALUES LESS THAN (20),
PARTITION p03 VALUES LESS THAN (30)
);

■既存テーブルにパーティションを追加

ALTER TABLE `battle_result` PARTITION BY RANGE( ID ) (
PARTITION p01 VALUES LESS THAN (10),
PARTITION p02 VALUES LESS THAN (20),
PARTITION p03 VALUES LESS THAN (30)
);

■既存テーブルのパーティションに追加

ALTER TABLE `battle_result` ADD PARTITION (
PARTITION p04 VALUES LESS THAN (40)
);


■(データ追加)
INSERT INTO battle_result ( player_id, opponent_id, result ) values ( '光宙(ぴかちゅう)', '金星(まぁず)', 1);
INSERT INTO battle_result ( player_id, opponent_id, result ) values ( '美俺(びおれ)', '金星(まぁず)', 1);
INSERT INTO battle_result ( player_id, opponent_id, result ) values ( '金星(まぁず)', '黄熊(ぷう)', 0);
INSERT INTO battle_result ( player_id, opponent_id, result ) values ( '月(らいと)', '天空(ありあ)', 1);
INSERT INTO battle_result ( player_id, opponent_id, result ) values ( '光宙(ぴかちゅう)', '金星(まぁず)', 1);

■既存テーブルのパーティションを削除

ALTER TABLE `battle_result` drop PARTITION p01;

■各パーティションの分割状況を確認

SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name="battle_result";

■SQLの実行計画を確認

EXPLAIN PARTITIONS SELECT * FROM battle_result WHERE opponent_id="金星(まぁず)" ORDER BY id desc LIMIT 5;
EXPLAIN PARTITIONS SELECT * FROM battle_result WHERE id="5";

  • Be the first to comment

My sqlカジュアル パーティショニング

  1. 1. カジュアルにパーティショニングMySQL Casual Talks @gumi福岡 @akimicyu
  2. 2. パーティショニング• 設定したルールに従っ て、データをパーティ ション分割する仕組み• MySQL では5.1から利 用可能 http://blogs.ricollab.jp/webtech/2009/10/mysql_partitioning_1/ より
  3. 3. パーティショニング• メリット • 大量データによる性能劣化を防止できる • アプリ側で設定ルールを意識する必要がない • (テーブルの水平分割・shardingに対する優位性)• デメリット • パーティショニングされたテーブルでは、外部キー が使用不可(参照する側・される側)
  4. 4. 使いどころ• こんなテーブルに効果的 • ユーザの行動ログ: データ量がN(ユーザ数)×T (リリース後の経過時間) に比例 • (特に)ユーザ間相互作用 → N2×T に比例 • 時系列に沿って大量データが作成されるもの • 古いデータを選択的に削除したいもの(DROP PARTITION)• 具体例(ゲーム): 戦闘履歴、挨拶、チャットログ
  5. 5. 実演
  6. 6. その他• shardingとも併用可 • ユーザIDでsharingしつつ、時系列パーティショニング とか• 運用中のテーブルをパーティショニングするのは結構大変 • 設計時に考慮しておいた方が吉 • (とはいえ、運用中のDBをshardingするよりは楽)
  7. 7. まとめ• パーティショニングはshardingよりカジュアルに導入できるよ

×