10bet网址
MySQL 5.6リファレンスマニュアル
下载本手册
PDF(美国高级主任)- 26.8 mb
PDF (A4)- 26.8 mb


19.4パ、ティションプル、ニング

このセクションでは,パ,ティションプル,ニングと呼ばれる最適化にいて説明します。パ,ティションプル,ニングの背後の中心概念は比較的単純で、一致する値がないパ,ティションはスキャンしないと表現できます。次のステ,トメントによって定義されたパ,ティション化されたテ,ブル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在(constant1constant2、……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'

最後のステトメントの場合,オプティマザは次のようにも動作できます。

  1. 範囲の下限が含まれるパティションを見けます

    (“1984-06-21”)は値1984を返し,それはパ,ティションd3に見かります。

  2. 範囲の上限が含まれるパティションを見けます

    (“1999-06-21”)1999と評価され,それはパ,ティションd5に見かります。

  3. これらの2つのパーティションおよびそれらの間にある可能性のあるパーティションのみをスキャンします

    この場合,これはパ,ティションd3d4,およびd5のみがスキャンされることを意味します。残りのパ,ティションは安全に無視できます(そして無視されます)。

重要

パ,ティション化されたテ,ブルに対するステ,トメントの在哪里条件で参照される無効な日期およびDATETIME値は,として扱われます。これは,Select * frompartitioned_table在哪里date_column<“2008-12-00”などのクエリは値を返さないことを意味します(Bug #40972を参照してください)。

ここまで,范围パーティショニングを使用する例のみを見てきましたが,プルーニングはほかのパーティショニングタイプにも適用できます。

次に示すテ,ブル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)。