[前][次][番号順一覧][スレッド一覧]

mysql:15573

From: Mikiya Okuno <Mikiya Okuno <mikiya.okuno@xxxxxxxxxx>>
Date: Fri, 15 Apr 2011 09:47:53 +0900
Subject: [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という本来検索の対象となるパーティションのみ選択されます。
>>>
>>> 以上、よろしくお願いいたします。
>>>
>>> 田中宣親
>>>
>>>
>>
>>
> 
> 

[前][次][番号順一覧][スレッド一覧]

     15568 2011-04-14 16:29 ["Nobuchika.tanaka" <] Partition pruningについて。             
     15569 2011-04-14 16:43 ┗[Mikiya Okuno <mikiya]                                       
     15570 2011-04-15 07:58  ┗["Nobuchika.tanaka" <]                                     
->   15573 2011-04-15 09:47   ┗[Mikiya Okuno <mikiya]