<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ricollab Web Tech Blog &#187; partitioning</title>
	<atom:link href="http://blogs.ricollab.jp/webtech/tag/partitioning/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.ricollab.jp/webtech</link>
	<description>ricollab engineers' blog</description>
	<lastBuildDate>Mon, 26 Apr 2010 02:09:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MySQLパーティショニングについて（その2：性能検証編）</title>
		<link>http://blogs.ricollab.jp/webtech/2009/11/mysql_partitioning_2/</link>
		<comments>http://blogs.ricollab.jp/webtech/2009/11/mysql_partitioning_2/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 07:38:14 +0000</pubDate>
		<dc:creator>hamada</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[partitioning]]></category>

		<guid isPermaLink="false">http://blogs.ricollab.jp/webtech/?p=83</guid>
		<description><![CDATA[こんにちは、濱田です。
前回から時間が経ってしまいましたが、今回は「性能検証編」ということで、パーティションドテーブルに対して実際にデータを挿入・参照することでパーティショニングの性能面を検証してみようと思います。
性能検証環境
使用したマシンのスペックは以下の通りです。

OS
CentOS 5.3 32bit (on Windows XP Pro SP3 32bit via VMware Server 2.0.0)
CPU
Core2 Duo E8300 2.83GHz (VMには1CPUを割り当て)
Memory
3.25GB (VMには512MBを割り当て)

MySQL のバージョンおよび設定は以下の通りです。なお、MySQL サーバおよびクライアントは同一マシン上で動作させました。

MySQL
5.1.35-community (設定は my-medium.cnf をそのまま使用)

また、パーティションドテーブルのスキーマは以下の通りです。
CREATE TABLE logs (
    id INT NOT NULL AUTO_INCREMENT,
    client_name VARCHAR(255) NOT NULL,
    log_data VARCHAR(1024) NOT NULL,
    logged_at DATETIME NOT NULL,
 [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは、濱田です。</p>
<p><a href="http://blogs.ricollab.jp/webtech/2009/10/mysql_partitioning_1/">前回</a>から時間が経ってしまいましたが、今回は「性能検証編」ということで、パーティションドテーブルに対して実際にデータを挿入・参照することでパーティショニングの性能面を検証してみようと思います。</p>
<h3>性能検証環境</h3>
<p>使用したマシンのスペックは以下の通りです。</p>
<dl>
<dt>OS</dt>
<dd>CentOS 5.3 32bit (on Windows XP Pro SP3 32bit via VMware Server 2.0.0)</dd>
<dt>CPU</dt>
<dd>Core2 Duo E8300 2.83GHz (VMには1CPUを割り当て)</dd>
<dt>Memory</dt>
<dd>3.25GB (VMには512MBを割り当て)</dd>
</dl>
<p>MySQL のバージョンおよび設定は以下の通りです。なお、MySQL サーバおよびクライアントは同一マシン上で動作させました。</p>
<dl>
<dt>MySQL</dt>
<dd>5.1.35-community (設定は my-medium.cnf をそのまま使用)</dd>
</dl>
<p>また、パーティションドテーブルのスキーマは以下の通りです。</p>
<pre><code>CREATE TABLE logs (
    id INT NOT NULL AUTO_INCREMENT,
    client_name VARCHAR(255) NOT NULL,
    log_data VARCHAR(1024) NOT NULL,
    logged_at DATETIME NOT NULL,
    PRIMARY KEY(id, logged_at),
    INDEX(client_name)
) ENGINE=MyISAM
PARTITION BY RANGE( TO_DAYS(logged_at) ) (
    PARTITION p200901 VALUES LESS THAN ( TO_DAYS('2009-02-01') ),
    PARTITION p200902 VALUES LESS THAN ( TO_DAYS('2009-03-01') ),
    PARTITION p200903 VALUES LESS THAN ( TO_DAYS('2009-04-01') ),
    PARTITION p200904 VALUES LESS THAN ( TO_DAYS('2009-05-01') ),
    PARTITION p200905 VALUES LESS THAN ( TO_DAYS('2009-06-01') ),
    PARTITION p200906 VALUES LESS THAN ( TO_DAYS('2009-07-01') ),
    PARTITION p200907 VALUES LESS THAN ( TO_DAYS('2009-08-01') ),
    PARTITION p200908 VALUES LESS THAN ( TO_DAYS('2009-09-01') ),
    PARTITION p200909 VALUES LESS THAN ( TO_DAYS('2009-10-01') ),
    PARTITION p200910 VALUES LESS THAN ( TO_DAYS('2009-11-01') ),
    PARTITION p200911 VALUES LESS THAN ( TO_DAYS('2009-12-01') ),
    PARTITION p200912 VALUES LESS THAN ( TO_DAYS('2010-01-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);
</code></pre>
<h3>データ挿入の性能検証</h3>
<h4>検証内容</h4>
<p>データ挿入の性能検証には下記 INSERT 文を1万回連続で発行し、それに要した時間を測定しました。INSERT 文の「?」の部分には &#8216;client_1&#8242; ～ &#8216;client_1000&#8242; がそれぞれ10回ずつ入ります。（実際には上記の処理を行なう Ruby スクリプトを作成し、その実行時間を time コマンドで測定しました）</p>
<pre><code>INSERT INTO logs (client_name, log_data, logged_at) \
VALUES (?, 'test log data', '2009-11-01');
</code></pre>
<p>logs テーブルの事前条件として、以下の2パターンで測定しました。</p>
<dl>
<dt>条件1</dt>
<dd>1件もレコードが格納されていない状態</dd>
<dt>条件2</dt>
<dd>1～10月の各月に1000クライアント×1000件分のログデータ（計1000万件）が格納されている状態</p>
<ul>
<li>logged_at : 10通り (&#8217;2009-01-01&#8242; ～ &#8216;2009-10-01&#8242;)</li>
<li>client_name : 1000通り (&#8217;client_1&#8242; ～ &#8216;client_1000&#8242;)</li>
<li>上記組み合わせをそれぞれ1000件ずつ</li>
</ul>
</dd>
</dl>
<h4>検証結果</h4>
<p>結果は図1のようになりました。</p>
<div style="text-align: center;"><img style="float: none; margin-bottom: 0em;" src="http://blogs.ricollab.jp/webtech/wp-content/uploads/2009/11/result_insert_myisam.png" alt="result_insert_myisam.png" /><br />
図1 : データ挿入の性能検証結果 (MyISAM)</div>
<p></p>
<p>条件1を見ると、パーティションあり／なしで処理時間が殆ど変わっていません。これはデータ挿入時にパーティション振り分け処理のオーバーヘッドが殆どないことを示しています。今回振り分け処理に用いたパーティショニング表現は TO_DAYS(logged_at) であり、この程度の処理ではパーティション振り分けのオーバーヘッドを全く気にしなくてよいことが分かります。</p>
<p>逆に言えば、パーティショニング表現に時間のかかる処理を用いてしまうとそこがボトルネックになってしまいます。それが気になる場合は、以下のように BENCHMARK() 関数を用いて事前にパーティショニング表現の処理時間を確認しておくとよいと思います。</p>
<pre><code>mysql&gt; SELECT BENCHMARK(10000, TO_DAYS('20091101') );
+---------------------------------------+
| benchmark(10000, TO_DAYS('20091101')) |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (<strong>0.00 sec</strong>)
</code></pre>
<p>また条件1、2での処理時間を比較すると、パーティションなしの場合は処理時間が増加しているのに対し、パーティションありの場合は処理時間が殆ど変わっていないことが分かります。これはインデックスデータがパーティション毎に独立して作成されることを示しています。今回のスキーマで作成されるインデックスは (id, logged_at) の複合インデックスと client_name ですが、このうち client_name はユニークなカラムではありません。そのため、事前に格納されているレコード数が多いほどインデックスデータ（BTREE 構造）の更新処理に時間がかかり、故にデータ挿入処理も遅くなります。</p>
<p>パーティションなしの場合に事前に0件と1000万件格納されている場合とで挿入時間に差が出ているのはそのためです。しかし、パーティションありの場合、条件2において p200911 （以降）には1件もレコードが格納されていない状態であるため、logged_at が &#8216;2009-11-01&#8242; （以降）のデータを挿入する場合はテーブルが空の場合と同じ処理時間になるのです。つまり、ログ情報のような日毎に蓄積されるデータを格納する場合、月別にパーティションを設定しておくことで、レコード数増加に伴い累積的に遅くなるデータ挿入処理の影響を一ヶ月分に抑えられることが分かります。</p>
<p>なお、ストレージエンジンを InnoDB にして同じ検証を行なってみましたが、MyISAM の場合と同様の結果になりました。（図2）</p>
<div style="text-align: center;"><img style="float: none; margin-bottom: 0em;" src="http://blogs.ricollab.jp/webtech/wp-content/uploads/2009/11/result_insert_innodb.png" alt="result_insert_innodb.png" /><br />
図2 : データ挿入の性能検証結果 (InnoDB)</div>
<h3>データ参照の性能検証</h3>
<h4>検証内容</h4>
<p>データ参照の性能検証には、MySQL クライアントから下記2パターンの SELECT 文を1回発行し、それに要した時間を測定しました。</p>
<dl>
<dt>条件1</dt>
<dd>client_name 指定なしで11月分のログデータ参照する</p>
<pre><code>SELECT * FROM logs WHERE logged_at &gt;= '2009-11-01' \
AND logged_at &lt; '2009-12-01';
</code></pre>
</dd>
<dt>条件2</dt>
<dd>client_name 指定ありで11月分のログデータ参照する</p>
<pre><code>SELECT * FROM logs WHERE logged_at &gt;= '2009-11-01' \
AND logged_at &lt; '2009-12-01' AND client_name = 'client_1';
</code></pre>
</dd>
</dl>
<p>logs テーブルの事前条件は、データ挿入の性能検証（条件2）を行なったときの状態としました。つまり、1～10月の各月に1000クライアント×1000件分のログデータが、11月に1000クライアント×10件分のログデータが格納されている状態（計1001万件）です。</p>
<h4>検証結果</h4>
<p>結果は図3のようになりました。</p>
<div style="text-align: center;"><img style="float: none; margin-bottom: 0em;" src="http://blogs.ricollab.jp/webtech/wp-content/uploads/2009/11/result_select_myisam.png" alt="result_select_myisam.png" /><br />
図3 : データ参照の性能検証結果 (MyISAM)</div>
<p></p>
<p>条件1を見ると、パーティションありの方が処理時間が劇的に速いことが分かります。これはパーティションなしでは全レコード（1001万件）を参照しているのに対し、パーティションありでは p200911 のレコード（1万件）のみを参照しているためです。これはオプティマイザが SELECT 文中のクエリ logged_at &gt;= &#8216;2009-11-01&#8242; AND logged_at &lt; &#8216;2009-12-01&#8242; から判断した結果です。理論的には検索件数が1001万から1万に減るので処理時間も1/1000になって欲しいところですが、そうなっていないのはオプティマイザの判断処理等によるオーバーヘッドの影響かもしれません。</p>
<p>なお、SELECT 文の前に EXPLAIN PARTITIONS を付けることで、参照時にアクセスするパーティションを調べることができます。（これを見るとなぜか p200912 にもアクセスしていることが分かります。なぜそうなるのかは分かりませんが…）</p>
<pre><code>mysql&gt; EXPLAIN PARTITIONS SELECT * FROM logs
    -&gt; WHERE logged_at &gt;= '2009-11-01'
    -&gt; AND logged_at &lt; '2009-12-01'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: logs
   partitions: <strong>p200911,p200912</strong>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10010000
        Extra: Using where
</code></pre>
<p>また、条件2を見ると、インデックス併用時にもパーティションありの方が処理時間が劇的に速いことが分かります。この場合、まずオプティマイザが参照に必要なパーティションを判断し、そこからさらに該当するパーティションのインデックス情報を使って参照するデータ数を絞り込んでいるようです。ここまでいくと、データ参照のコストがほぼゼロになりました。</p>
<p>なお、ストレージエンジンを InnoDB にして同じ検証を行なってみましたが、こちらも MyISAM の場合と同様の結果になりました。（図4）</p>
<div style="text-align: center;"><img style="float: none; margin-bottom: 0em;" src="http://blogs.ricollab.jp/webtech/wp-content/uploads/2009/11/result_select_innodb.png" alt="result_select_innodb.png" /><br />
図4 : データ参照の性能検証結果 (InnoDB)</div>
<h3>まとめ</h3>
<p>本エントリでは、パーティションドテーブルに対して実際にデータを挿入・参照することでパーティショニングの性能面を検証しました。その結果、今回検証した条件ではデータ挿入・参照のいずれにおいてもパーティショニングしない場合に比べて性能が向上することが分かりました。</p>
<p>このように、パーティショニングは上手に利用すればいいことずくめとなる機能です。本エントリがパーティショニング活用に役立てれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ricollab.jp/webtech/2009/11/mysql_partitioning_2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLパーティショニングについて（その1：基本知識編）</title>
		<link>http://blogs.ricollab.jp/webtech/2009/10/mysql_partitioning_1/</link>
		<comments>http://blogs.ricollab.jp/webtech/2009/10/mysql_partitioning_1/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 04:02:47 +0000</pubDate>
		<dc:creator>hamada</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[partitioning]]></category>

		<guid isPermaLink="false">http://blogs.ricollab.jp/webtech/?p=75</guid>
		<description><![CDATA[初めまして、リコーの濱田です。このたび私も本ブログを担当することになりました。今後ともよろしくお願いいたします。
本エントリではデータベースに関する技術トピックとして、MySQL 5.1 から導入された機能であるパーティショニングについて書こうと思います。少し長くなりそうなので、「基本知識編」「性能検証編」の2回に分けて書くことにします。
今回は「基本知識編」として、パーティショニングの概要と基本的な使い方について紹介します。
パーティショニングの概要
パーティショニングとは、事前に設定されたルールに従ってデータをパーティションと呼ばれる部分的なテーブルに分割する仕組みです。
データ挿入時には、設定ルールに従ってデータが該当するパーティションに自動的に振り分けられます。データ参照時には、オプティマイザがクエリから必要なパーティションを判断し、該当するパーティションのみにアクセスします。これらは MySQL の内部で行なわれるため、データの操作においてパーティショニングを意識する必要はありません。

パーティショニングを利用することで、以下の利点が得られます。

大量のデータを処理することによる性能上のボトルネックの発生を抑えられる
テーブルサイズに上限がある場合（MyISAMなど）でも、その上限を超える量のデータを格納できる

パーティションドテーブルの作成
それでは実際にパーティションドテーブル（パーティショニングされたテーブル）を作成してみます。パーティショニングにはいくつかの種類がありますが、ここでは RANGE パーティショニングについて説明します。
パーティションドテーブルの作成は簡単で、通常のテーブル作成文の後にパーティション設定ルールの記述を追加するだけです。以下の例は、複数クライアントのログ情報を月別に分けて格納するパーティションドテーブルの作成例です。
CREATE TABLE logs (
    id INT NOT NULL AUTO_INCREMENT,
    client_name VARCHAR(32) NOT NULL,
    log_data VARCHAR(1024) NOT NULL,
    logged_at DATETIME NOT NULL,
    PRIMARY KEY(id, logged_at),
    INDEX(client_name)
) ENGINE=MyISAM
PARTITION BY RANGE( TO_DAYS(logged_at) ) (
 [...]]]></description>
			<content:encoded><![CDATA[<p>初めまして、リコーの濱田です。このたび私も本ブログを担当することになりました。今後ともよろしくお願いいたします。</p>
<p>本エントリではデータベースに関する技術トピックとして、MySQL 5.1 から導入された機能であるパーティショニングについて書こうと思います。少し長くなりそうなので、「基本知識編」「性能検証編」の2回に分けて書くことにします。</p>
<p>今回は「基本知識編」として、パーティショニングの概要と基本的な使い方について紹介します。</p>
<h3>パーティショニングの概要</h3>
<p>パーティショニングとは、事前に設定されたルールに従ってデータをパーティションと呼ばれる部分的なテーブルに分割する仕組みです。</p>
<p>データ挿入時には、設定ルールに従ってデータが該当するパーティションに自動的に振り分けられます。データ参照時には、オプティマイザがクエリから必要なパーティションを判断し、該当するパーティションのみにアクセスします。これらは MySQL の内部で行なわれるため、データの操作においてパーティショニングを意識する必要はありません。<br />
<a href="http://blogs.ricollab.jp/webtech/wp-content/uploads/2009/10/partitioning.png"><img class="alignnone size-full wp-image-116" style="float: none" title="partitioning" src="http://blogs.ricollab.jp/webtech/wp-content/uploads/2009/10/partitioning.png" alt="partitioning" width="512" height="340" /></a><br />
パーティショニングを利用することで、以下の利点が得られます。</p>
<ul>
<li>大量のデータを処理することによる性能上のボトルネックの発生を抑えられる</li>
<li>テーブルサイズに上限がある場合（MyISAMなど）でも、その上限を超える量のデータを格納できる</li>
</ul>
<h3>パーティションドテーブルの作成</h3>
<p>それでは実際にパーティションドテーブル（パーティショニングされたテーブル）を作成してみます。パーティショニングにはいくつかの種類がありますが、ここでは RANGE パーティショニングについて説明します。</p>
<p>パーティションドテーブルの作成は簡単で、通常のテーブル作成文の後にパーティション設定ルールの記述を追加するだけです。以下の例は、複数クライアントのログ情報を月別に分けて格納するパーティションドテーブルの作成例です。</p>
<pre><code>CREATE TABLE logs (
    id INT NOT NULL AUTO_INCREMENT,
    client_name VARCHAR(32) NOT NULL,
    log_data VARCHAR(1024) NOT NULL,
    logged_at DATETIME NOT NULL,
    PRIMARY KEY(id, logged_at),
    INDEX(client_name)
) ENGINE=MyISAM
PARTITION BY RANGE( TO_DAYS(logged_at) ) (
    PARTITION p200910 VALUES LESS THAN ( TO_DAYS('2009-11-01') ),
    PARTITION p200911 VALUES LESS THAN ( TO_DAYS('2009-12-01') ),
    PARTITION p200912 VALUES LESS THAN ( TO_DAYS('2010-01-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);
</code></pre>
<p>PARTITION BY RANGE 以下がパーティション設定ルールです。上記の例では p200910、p200911、p200912、pmax という名前の4つのパーティションが作成され、TO_DAYS(logged_at) の値を基にデータが各パーティションに振り分けられる設定になっています。例えば、logged_at が &#8216;2009-11-01&#8242; より小さいデータは p200910 に格納されるといった具合です。ここで、振り分けに利用される表現（上記例では TO_DAYS(logged_at) ）を「パーティショニング表現」と呼びます。</p>
<p>パーティション設定ルールの最後の行の &#8220;VALUES LESS THAN MAXVALUE&#8221; は「キャッチオール」節と呼ばれるものです。MAXVALUE は表現可能な最大整数値を表すので、logged_at が &#8216;2010-01-01&#8242; 以上となるデータは全て pmax に格納されます。これが無いと、logged_at が &#8216;2010-01-01&#8242; 以上となるデータを格納する場合にエラーが起こります。</p>
<p>なお、パーティションドテーブルの作成に際してはいくつかの制約があります。以下に代表的なものを挙げておきます。</p>
<ul>
<li> パーティショニング表現に用いられるカラムはテーブル内に存在するプライマリキー（またはユニークキー）の一部でなければならない
<ul>
<li>プライマリキー（またはユニークキー）が存在しない場合は例外</li>
</ul>
</li>
<li>パーティション表現は連続した整数値をとるものでなければならない
<ul>
<li>日付データを利用する場合、TO_DAYS() 関数などを使って整数値に直す必要がある</li>
</ul>
</li>
<li>作成できるパーティションの上限は1テーブルにつき1024個</li>
</ul>
<h3>パーティションの追加</h3>
<p>既存のパーティションドテーブルから更にパーティションを追加する方法は2つあります。</p>
<ul>
<li>ADD PARTITION を使って新規パーティションを追加する方法</li>
<li>REORGANIZE PARTITION を使って既存のパーティションを再分割する方法</li>
</ul>
<p>ただし、既存のパーティションドテーブルに「キャッチオール」節が存在する場合は後者の方法しか選択肢がありません。</p>
<p>以下にそれぞれの方法について説明します。</p>
<h4>ADD PARTITION を使う方法</h4>
<p>既存のパーティションドテーブルにパーティションを新規追加するには以下のようにします。</p>
<pre><code>ALTER TABLE logs ADD PARTITION (
    PARTITION p201001 VALUES LESS THAN ( TO_DAYS('2010-02-01') )
);
</code></pre>
<p>注意点として、RANGE パーティショニングされているテーブルにおいて、ADD PARTITION は既存パーティションの「後」にしかパーティション追加ができません（「前」や「間」はNGです）。そのため、「キャッチオール」節（MAXVALUE）が既に存在する場合は（MAXVALUE より後の値は存在し得ないため）、この方法が使えません。</p>
<h4>REORGANIZE PARTITION を使う方法</h4>
<p>既存のパーティションを再分割するには以下のようにします。この例では、pmax を p201001 と、（新しい） pmax に再分割しています。</p>
<pre><code>ALTER TABLE logs REORGANIZE PARTITION pmax INTO (
    PARTITION p201001 VALUES LESS THAN ( TO_DAYS('2010-02-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);
</code></pre>
<p>REORGANIZE PARTITION を行なうと、既存のデータが再分割後のパーティションに適切に振り分けられます。例えば上記の例では、旧 pmax に格納されていたデータのうち logged_at が &#8216;2009-02-01&#8242; より小さいものは p201001 に、&#8217;2009-02-01&#8242; 以上のものは 新 pmax に格納されます。この再振り分け処理により、既存データが大量にある場合は REORGANIZE PARTITION の実行にそれなりの時間がかかります。</p>
<p>REORGANIZE PARTITION は、既存パーティションの結合にも利用できます。例えば、p200910 と p200911 を結合したい場合は以下のようにします。</p>
<pre><code>ALTER TABLE logs REORGANIZE PARTITION p200910, p200911 INTO (
    PARTITION p200910_11 VALUES LESS THAN ( TO_DAYS('2009-12-01') )
);
</code></pre>
<p>さらに、既存の複数パーティションを新しい複数パーティションに再構成することもできます。</p>
<pre><code>ALTER TABLE logs REORGANIZE PARTITION p200910, p200911, p200911, pmax INTO (
    PARTITION p200909_10 VALUES LESS THAN ( TO_DAYS('2009-11-01') ),
    PARTITION p200911_12 VALUES LESS THAN ( TO_DAYS('2010-01-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);
</code></pre>
<h3>パーティションの削除</h3>
<p>パーティションドテーブルから特定のパーティションを削除するには、以下のようにしてパーティションごと DROP します。</p>
<pre><code>ALTER TABLE logs DROP PARTITION p200912;
</code></pre>
<p>上記の例では、パーティション p200912 および p200912 に格納されているデータが全て削除されます。また、上記例の実行前に p200910、p200911、p200912、pmax のパーティションがあった場合、p200912 が削除されたことで logged_at が ‘2009-12-01′ 以上となるデータは全て pmax に格納されるようになります。</p>
<p>パーティションの削除は内部的にテーブルの DROP とほぼ同じであるため、（ストレージエンジンが MyISAM や InnoDB の場合であれば）格納されているデータ件数によらず一瞬で処理が完了します。</p>
<h3>パーティショニングの解除</h3>
<p>パーティションドテーブルからパーティションを取り除き、通常のテーブルにするには以下のようにします。</p>
<pre><code>ALTER TABLE logs REMOVE PARTITIONING;
</code></pre>
<p>DROP PARTITION とは異なり、各パーティションに格納されているデータは削除されません。各パーティションのデータを一つのテーブルにマージするため、既存データが大量にある場合は REMOVE PARTITIONING の実行にそれなりの時間がかかります。</p>
<h3>まとめ</h3>
<p>本エントリでは、MySQL 5.1 から導入された機能であるパーティショニングについて概要を説明し、RANGE パーティショニングによるパーティションドテーブルの作成、パーティションの追加・削除、パーティショニングの解除方法について具体例を交えて説明しました。RANGE パーティショニング以外のパーティショニング方法などパーティショニングについてより深く知りたい方は、<a href="http://dev.mysql.com/doc/refman/5.1/ja/partitioning.html">MySQL 5.1 リファレンスマニュアル :: 15 パーティショニング</a> を一読されると良いと思います。</p>
<p>次回のエントリでは、パーティションドテーブルに対して実際にデータを挿入・参照することでパーティショニングの性能面を検証してみようと思います。お楽しみに！</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ricollab.jp/webtech/2009/10/mysql_partitioning_1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
