Blog ブログ
Archive
OLDER
2018.05(1)
2018.04(1)
2018.03(2)
2017.11(2)
2017.10(1)
2017.08(1)
2017.07(4)
2017.06(3)
2017.05(2)
2017.04(3)
2017.03(2)
2017.02(2)
2017.01(2)
2016.12(3)
2016.11(3)
2016.10(3)
2016.09(3)
2016.06(2)
2016.03(1)
2016.02(1)
2016.01(2)
2015.12(4)
2015.11(1)
2015.10(3)
2015.09(3)
2015.08(3)
2015.07(2)
2015.06(6)
2015.05(2)
2015.04(2)
2015.03(5)
2015.02(8)
2015.01(2)
2014.12(4)
2014.11(2)
2014.10(1)
2014.09(1)
パーティションを使って快適ログ集計
CCSプログラマの吉村と申します。
皆様はログの集計などを行われた事はありますでしょうか?
今回はMySQLのパーティションの紹介を行いたいと思います。
中でもログデータが100万件などを超えた場合は集計に時間が掛かってしまいます。
そこで今回紹介するのが、MySQLのVer5.1から使用出来るようになった
パーティションになります。
パーティションになります。
■パーティションとは?
簡単に説明するとDBのレコードに敷居(ルール)を設定し、
振り分けて管理することができるというものです。
データ取得時にもパーティション毎にデータを取得できるので、
全データから情報を取得するより、ずっと少ないデータから情報を
取得出来る事になります。
取得出来る事になります。
■パーティションの種類
パーティションにはいくつか種類がありますので一部簡単に紹介します。
今回使用するのはRANGEになります。
今回使用するのはRANGEになります。
ログデータや時系列データなど連続的にデータが存在する場合に有効です。
・RANGE ・・・ 範囲を指定して振り分ける
利用例としては、履歴を蓄積するテーブルを日や月単位で分割する等
利用例としては、履歴を蓄積するテーブルを日や月単位で分割する等
・LIST ・・・ 格納する値で振り分ける
利用例としては、地域IDに基づく分割等
利用例としては、地域IDに基づく分割等
・HASH ・・・ 1つのカラムの値を式の結果で振り分ける
利用例としては、独立した複数のディスクそれぞれに表領域を作成し、
ディスク間で均等になるようにデータを配置したい場合等
利用例としては、独立した複数のディスクそれぞれに表領域を作成し、
ディスク間で均等になるようにデータを配置したい場合等
説明より実際に見た方がわかりやすので見て行きましょう!
1.テーブルを作成しましょう。
今回は呼び出されたAPIを、日付毎に保存するようなDBを作成します。
注意が必要な点としてパーティションのキーになるカラムは、
プライマリーキーに含める必要があります。
注意が必要な点としてパーティションのキーになるカラムは、
プライマリーキーに含める必要があります。
CREATE TABLE IF NOT EXISTS `kpi_log`.`partition_test` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT ‘ID’,
`date` DATETIME NOT NULL COMMENT ‘日’,
`api` BIGINT NOT NULL COMMENT ‘api’,
`user_id` BIGINT NOT NULL COMMENT ‘ユーザーID’,
PRIMARY KEY (`id`, `date`))
COMMENT = ‘パーティションテスト’;
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT ‘ID’,
`date` DATETIME NOT NULL COMMENT ‘日’,
`api` BIGINT NOT NULL COMMENT ‘api’,
`user_id` BIGINT NOT NULL COMMENT ‘ユーザーID’,
PRIMARY KEY (`id`, `date`))
COMMENT = ‘パーティションテスト’;
テスト用のテーブルを用意しました。
2.作成したテーブルにパーティションを作成しましょう。
以下は、1日おきにパーティションを作成するSQLになります。
ALTER TABLE partition_test PARTITION BY RANGE columns(date) (
PARTITION p20150605 VALUES LESS THAN (‘2015-06-05 00:00:00’),
PARTITION p20150606 VALUES LESS THAN (‘2015-06-06 00:00:00’),
PARTITION p20150607 VALUES LESS THAN (‘2015-06-07 00:00:00’),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
PARTITION p20150605 VALUES LESS THAN (‘2015-06-05 00:00:00’),
PARTITION p20150606 VALUES LESS THAN (‘2015-06-06 00:00:00’),
PARTITION p20150607 VALUES LESS THAN (‘2015-06-07 00:00:00’),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
これでパーティションの作成が行えました。
3.実際に作成出来ているか確認して見ましょう。
以下のSQLでパーティションを確認する事が出来ます。
select TABLE_SCHEMA,TABLE_NAME,PARTITION_NAME,
PARTITION_ORDINAL_POSITION,
TABLE_ROWS
from INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME=’partition_test’;
2.で指定した通り、1日おきにパーティションが作成されている事が確認出来ました。
4.実際に値が入るかデータを入れて確認してみましょう。
下記のようなテストデータを用意します。
再度、パーティションの中身を確認してみましょう。
実際に日付毎にデータが分けて入っているのが確認出来ましたね。
5.最後にデータを取得してみましょう。
上記のSQLでは、指定したパーティションからデータの取得を行います。
1件しかデータを取得していない事から、
指定したパーティションから、データを取得出来ている事が確認出来た事が分かります。
これで作成からデータの取得までの一連の流れをおこないましたが、
指定したパーティションから、データを取得出来ている事が確認出来た事が分かります。
これで作成からデータの取得までの一連の流れをおこないましたが、
とても簡単に設定や削除などを行うことが出来ます。
例では1日おきにパーティションを設定しました。
これにより、本来全データから集計を行う所を、日毎にデータの取得を行う事が出来るようになるのです。
いかがでしょうか?
いかがでしょうか?
皆さんもパーティションをうまく使用して、快適なログ収集を行えるようになりましょう。
採用情報
クラウドクリエイティブスタジオではプログラマを募集しております。
ぜひ、一緒に面白いゲームを作りましょう!
ぜひ、一緒に面白いゲームを作りましょう!