2011年4月14日

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

奥野です。

この挙動は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月14日 16:43
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103156
トラックバック
コメント
コメントする




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