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

mysql:15569

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

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

     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]