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]