このセクションでは,パ,ティションプル,ニングと呼ばれる最適化にいて説明します。パ,ティションプル,ニングの背後の中心概念は比較的単純で、「一致する値がないパ,ティションはスキャンしない」と表現できます。次のステ,トメントによって定義されたパ,ティション化されたテ,ブルt1
があるとします。
CREATE TABLE t1 (fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, region_code TINYINT UNSIGNED NOT NULL, dob DATE NOT NULL) PARTITION BY RANGE(region_code)(分区p0值小于(64),分区p1值小于(128),分区p2值小于(192),分区p3值小于MAXVALUE);
次のような选择
ステ,トメントから結果を取得するとします。
SELECT fname, lname, region_code, dob FROM t1 WHERE region_code > 125 AND region_code < 130;
返すべき行がパ,ティションp0
にもp3
にもないことは簡単にわかります。つまり,パーティションp1
およびp2
のみを検索して一致する行を見ける必要があります。そうすることにより,一致する行を検索するために消費する時間と労力が,テーブル内のすべてのパーティションのスキャンに必要なものより少なくて済みます。必要のないパ,ティションをこのように「省く」ことをプル,ニングといいます。オプティマイザがこのクエリーの実行でパーティションプルーニングを使用できるときは,同じカラム定義およびデータが含まれているパーティション化されていないテーブルで同じクエリーを実行するよりも,速度が大幅に向上することがあります。
在哪里
2条件を次のつのケースのいずれかにまとめられるとき,オプティマイザはプルーニングを実行できます。
partition_column
=常数
partition_column
在(constant1
,constant2
、……constantN
)
最初のケースで,オプティマイザは指定された値についてパーティショニング式を単純に評価し,どのパーティションに値が含まれるかを判別して,このパーティションのみをスキャンします。多くの場合、この等号を別の算術比較(<
、>
、< =
、> =
,および<>
を含む)に置き換えることができます。在哪里
句で之间的
を使用するクエリ,も,パ,ティションプル,ニングの利点を活用できます。このセクションの後続の例を参照してください。
2番目のケースで,オプティマイザはリスト内の各値についてパーティショニング式を評価して,一致するパーティションのリストを作成してから,このパーティションリストのパーティションのみをスキャンします。
MySQLは,パ,ティションプル,ニングを选择
、删除
,および更新
ステ,トメントに適用できます。插入
ステ,トメントは現在のところ,プル,ニングできません。
短い範囲にもプルニングを適用できます(オプティマザが同等の値リストに変換できるもの)。たとえば,前の例では,在哪里
句をWHERE region_code IN (126, 127, 128, 129)
に変換できます。3p1
に見かり,残りの3の値はパティションp2
に見つかり,ほかのパーティションには関連する値は含まれないため一致する行を検索する必要がないと判断できます。
MySQL 5.6のオプティマescザは,范围列
または名单列
パ、ティショニングを使用するテ、ブルの複数のカラムで、前述のタ、プの比較を使用する在哪里
条件のプル,ニングを実行することもできます。
このタイプの最適化は,パーティショニング式が同一性や範囲で構成されていてそれを同一性のセットにまとめられるとき,またはパーティショニング式が増減する関係を表すときに適用できます。パ,ティショニング式が年()
またはTO_DAYS ()
関数を使用するとき,日期
カラムまたはDATETIME
カラムでパ,ティション化されるテ,ブルにプル,ニングを適用することもできます。また,MySQL 5.6では,パ,ティショニング式がTO_SECONDS ()
関数を使用するとき,そのようなテ,ブルにプル,ニングを適用できます。
テブルt2
が次のように定義されて,日期
カラムでパ,ティション化されるとします。
创建表t2 (fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, region_code TINYINT UNSIGNED NOT NULL, dob DATE NOT NULL)分区范围(年份(dob))(分区d0值小于(1970),分区d1值小于(1975),分区d2值小于(1980),分区d3值小于(1985),分区d4值小于(1990),分区d5值小于(2000),分区d6值小于(2005),分区d7值小于MAXVALUE);
t2
を使用する次のステ,トメントでは,パ,ティションプル,ニングを使用できます。
SELECT * FROM t2 WHERE dob = '1982-06-23';WHERE dob BETWEEN '1991-02-15' AND '1997-04-25';DELETE FROM t2 WHERE dob >= '1984-06-21' AND dob <= '1999-06-21'
最後のステトメントの場合,オプティマザは次のようにも動作できます。
範囲の下限が含まれるパティションを見けます。
(“1984-06-21”)
は値1984
を返し,それはパ,ティションd3
に見かります。範囲の上限が含まれるパティションを見けます。
(“1999-06-21”)
は1999
と評価され,それはパ,ティションd5
に見かります。これらの2つのパーティションおよびそれらの間にある可能性のあるパーティションのみをスキャンします。
この場合,これはパ,ティション
d3
、d4
,およびd5
のみがスキャンされることを意味します。残りのパ,ティションは安全に無視できます(そして無視されます)。
パ,ティション化されたテ,ブルに対するステ,トメントの在哪里
条件で参照される無効な日期
およびDATETIME
値は,零
として扱われます。これは,Select * from
などのクエリは値を返さないことを意味します(Bug #40972を参照してください)。partitioned_table
在哪里date_column
<“2008-12-00”
ここまで,范围
パーティショニングを使用する例のみを見てきましたが,プルーニングはほかのパーティショニングタイプにも適用できます。
次に示すテ,ブルt3
のように,パ,ティショニング式が増加または減少している列表
によってパ,ティション化されたテ,ブルがあるとします。(この例では,簡単にするためにregion_code
カラムが値1から10まで(両端を含む)に制限されると想定します)。
CREATE TABLE t3 (fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, region_code TINYINT UNSIGNED NOT NULL, dob DATE NOT NULL) PARTITION BY LIST(region_code) (PARTITION r0 VALUES IN (1,3), PARTITION r1 VALUES IN (2,5,8), PARTITION r2 VALUES IN (4,9), PARTITION r3 VALUES IN (6,7,10));
SELECT * FROM t3 WHERE region_code在1到3之间
などのステートメントの場合,オプティマイザはどのパーティションで値1,2,および3が見つかるかを判別して(r0
およびr1
),残りのもの(r2
およびr3
)をスキップします。
哈希
または(线性)的关键
によってパ,ティション化されたテ,ブルの場合も,パ,ティショニング式で使用されるカラムに対して在哪里
句が単純な=
関係を使用しているときは,パ,ティションプル,ニングを適用できます。次のように作成されたテ,ブルがあるとします。
CREATE TABLE t4 (fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, region_code TINYINT UNSIGNED NOT NULL, dob DATE NOT NULL) PARTITION BY KEY(region_code) PARTITION 8;
カラム値を定数と比較するステ,トメントはプル,ニングできます。
UPDATE t4 WHERE region_code = 7;
プル,ニングは短い範囲にも適用できます。オプティマ@ @ザがそのような条件を在
関係に変換できるためです。たとえば,前に定義したものと同じテーブルt4
を使用して,次のようなクエリ,をプル,ニングできます。
SELECT * FROM t4 WHERE region_code < 6;SELECT * FROM t4 WHERE region_code在3到5之间;
どらの場合も,在哪里
句はオプティマ@ @ザによってWHERE region_code IN (3,4,5)
に変換されます。
この最適化は,範囲サ。次のステ,トメントがあるとします。
DELETE FROM t4 WHERE region_code在4到12之间;
在哪里
句の範囲は9個の値(4,5,6,7,8,9,10,11,12)ですが,t4
のパティションは8個だけです。これはこの删除
をプル,ニングできないことを意味します。
哈希
または(线性)的关键
によってパーティション化されたテーブルの場合,プルーニングを使用できるのは整数カラムに対してのみです。たとえば,强加于人
は日期
カラムであるため,次のステ,トメントにはプル,ニングを使用できません。
SELECT * FROM t4 WHERE dob >= '2001-04-14' AND dob <= '2005-10-15';
ただし,このテ,ブルが年値をINT
カラムに格納する場合は,WHERE year_col >= 2001 AND year_col <= 2005
を持クエリをプルニングできます。
MySQL 5.6.8以降では,自動パーティショニングを提供するストレージエンジン(MySQL集群によって使用されるNDB
ストレージエンジン(現在のところ,MySQL 5.6ではサポートされません)など)を使用するすべてのテーブルで,パーティションプルーニングは無効です(错误# 14672885)。MySQL 5.6.10以降では,明示的にパーティション化されている場合は,そのようなテーブルをプルーニングできます(错误# 14827952)。