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]