2011年4月15日

[mysql 15573] Re: Partition pruningについて。

奥野です。

なるほど!5.5ならRANGE COLUMNSでもOKですね。
RANGE COLUMNSはSHOW CREATE TABLEコマンドの出力結果で
パーティションの定義が見やすくなるという利点もあるので
おすすめです。

解決して良かったです。

--
奥野 幹也
http://www.google.com/profiles/mikiya.okuno
http://nippondanji.blogspot.com/
http://twitter.com/nippondanji


On 04/15/2011 07:58 AM, Nobuchika.tanaka wrote:
> 田中です。
>
> ご説明いただいた仕様にて、なぜ先頭のパーティションも
> 選択されれるのかを理解することが出来ました。
>
> いただいた情報を基にインターネットをj検索した所、
> 海外のフォーラムにて、同じ内容がすでに議論されている事がわかりました。
>
> Re: Partition Pruning
> http://forums.mysql.com/read.php?106,386051,387925#msg-387925
>
> 奥野さんからご指摘いただいた通り、TO_DAYS()が単調写像ではなく
> NULLを返す可能性があるため、NULLのデータが保存される
> 先頭のパーティションも選択されるとの事です。
>
> 対策としては、RANGE COLUMNSパーティショニングを使う事にしました。
> この方法であれば、TO_DAYS()関数を使用しないので、
> 先頭のパーティションが選択されなくなりました。
>
> ○パーティションの設定方法
> PARTITION BY RANGE COLUMNS(end_time_date) (
> PARTITION p_2002_8_5 VALUES LESS THAN ('2002-8-12'),
> PARTITION p_2002_8_12 VALUES LESS THAN ('2002-8-19'),
> PARTITION p_2002_8_19 VALUES LESS THAN ('2002-8-26'),
>  #中略
> PARTITION p_2022_2_28 VALUES LESS THAN ('2022-3-7'),
> PARTITION p_2022_3_7 VALUES LESS THAN ('2022-3-14'),
> PARTITION p_maxvalue VALUES LESS THAN maxvalue
> );
>
> ○Partition pruning動作確認
>
> use development;
>
> explain partitions
>
> select
> *
> from
> t1
> where
> end_time_date>= '2011-03-28' and
> end_time_date< '2011-04-03' \G
>
> *************************** 1. row ***************************
> id: 1
> select_type: SIMPLE
> table: t1
> partitions: p_2011_3_28
> type: ALL
> possible_keys: end_time_date_idx
> key: NULL
> key_len: NULL
> ref: NULL
> rows: 266901
> Extra: Using where
>
> ※p_2011_3_28という本来検索の対象となるパーティションのみ選択されるようになりました。
>
> これにて、無事問題が解決いたしました。
> アドバイスありがとうございました。
>
> 田中宣親
>
>
> (2011/04/14 16:43), Mikiya Okuno wrote:
>> 奥野です。
>>
>> この挙動はMySQLの仕様です。
>>
>> MySQLのパーティショニングでは、評価式の結果がNULLになった場合、
>> 先頭のパーティションにレコードが格納されます。
>> TO_DAYS()はzero date(月や日が0の日付)などを入力すると
>> NULLを出力するのですが、WHERE句の条件ではzero dateが含まれるかどうか
>> までは分かりませんので、評価式の結果がNULLとなる可能性が否定できません。
>> そのため、評価式の結果がNULLとなるレコードが格納されている先頭の
>> パーティションもSELECTの対象になるのです。
>>
>> 対策として、先頭に空のパーティションを設定しておくことをおすすめいたします。
>> (コマンドはALTER TABLE ... REORGANIZE PARTITION ...です。)
>> VALUES LESS THANの値を極端に小さくしておけば、そのパーティションには
>> レコードが含まれませんので、SELECTをしてもパフォーマンスの
>> オーバーヘッドは生じません。
>>
>> ではでは。
>> --
>> 奥野 幹也
>> http://www.google.com/profiles/mikiya.okuno
>> http://nippondanji.blogspot.com/
>> http://twitter.com/nippondanji
>>
>>
>>
>> On 04/14/2011 04:29 PM, Nobuchika.tanaka wrote:
>>
>>> 田中(たなか)と申します。
>>>
>>> パーティショニングをしたテーブルから、特定のパーティションにあるデータを
>>> selectする際、
>>> 特定のパーティション以外のパーティションも選択され困っております。
>>> 特定のパーティションのみ選択され方法をご存知の方がいましたら、
>>> アドバイスをお願いいたします。
>>>
>>> ○環境
>>>  −MySQL:5.5.8
>>>  −OS:Redhat5.5
>>>
>>> ○パーティションの設定方法
>>>  −end_time_date(Date型のカラム)を基準に、1週間毎のデータのパーティショ
>>> ンを1024個を設定。
>>>
>>> PARTITION BY RANGE (to_days(end_time_date)) (
>>> PARTITION p_2002_8_5 VALUES LESS THAN (to_days('2002_8_12')),
>>> PARTITION p_2002_8_12 VALUES LESS THAN (to_days('2002_8_19')),
>>> PARTITION p_2002_8_19 VALUES LESS THAN (to_days('2002_8_26')),
>>>  #中略
>>> PARTITION p_2022_2_28 VALUES LESS THAN (to_days('2022_3_7')),
>>> PARTITION p_2022_3_7 VALUES LESS THAN (to_days('2022_3_14')),
>>> PARTITION p_maxvalue VALUES LESS THAN maxvalue
>>> );
>>>
>>> ○Partition pruning動作確認
>>>  −2011/03/28から2011/04/03の1週分のデータをselectする際に対象となる
>>> パーティションを確認
>>>
>>> use development;
>>>
>>> explain partitions
>>>
>>> select
>>> *
>>> from
>>> t1
>>> where
>>> end_time_date>= '2011-03-28' and
>>> end_time_date< '2011-04-03' \G
>>>
>>> *************************** 1. row ***************************
>>> id: 1
>>> select_type: SIMPLE
>>> table: t1
>>> partitions: p_2002_8_5,p_2011_3_28
>>> type: ALL
>>> possible_keys: end_time_date_idx
>>> key: NULL
>>> key_len: NULL
>>> ref: NULL
>>> rows: 266901
>>> Extra: Using where
>>>
>>> ※p_2002_8_5という本来検索の対象とならないパーティションが選択されています。
>>>
>>> ただし、where句の条件を範囲指定にしない場合、正しくパーティションが選択
>>> されます。
>>>
>>> use development;
>>>
>>> explain partitions
>>>
>>> select
>>> *
>>> from
>>> t1
>>> where
>>> end_time_date = '2011-04-01' \G
>>>
>>> *************************** 1. row ***************************
>>> id: 1
>>> select_type: SIMPLE
>>> table: job
>>> partitions: p_2011_3_28
>>> type: ref
>>> possible_keys: end_time_date_idx
>>> key: end_time_date_idx
>>> key_len: 3
>>> ref: const
>>> rows: 36421
>>> Extra:
>>>
>>> ※p_2011_3_28という本来検索の対象となるパーティションのみ選択されます。
>>>
>>> 以上、よろしくお願いいたします。
>>>
>>> 田中宣親
>>>
>>>
>>
>>
>
>


投稿者 xml-rpc : 2011年4月15日 09:47
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103152
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。