すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:パーティションテーブルとレプリケートテーブルを作成するための CREATE TABLE ステートメントの使用

最終更新日:Jun 20, 2025

このトピックでは、CREATE TABLE ステートメントを使用して AnalyticDB for MySQL でパーティションテーブルとレプリケートテーブルを作成する方法、およびテーブルの分散キー、パーティションキー、インデックス、パーティションライフサイクル、ホットデータとコールドデータの階層型ストレージポリシーを指定する方法について説明します。

テーブルのデータ分散スキーム

次の図は、テーブルを作成する前に理解しておく必要がある概念(シャード、パーティション、クラスタ化インデックスなど)を示しています。

image

構文

CREATE TABLE [IF NOT EXISTS] table_name
  ({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
  | table_constraints}
  [, ... ])
  [table_attribute]
  [partition_options]
  [index_all]
  [storage_policy]
  [block_size]
  [engine]
  [table_properties]
  [AS query_expr]
  [COMMENT 'table_comment']

column_attributes:
  [DEFAULT {constant | CURRENT_TIMESTAMP}]
  [AUTO_INCREMENT]

column_constraints:
  [{NOT NULL|NULL} ]
  [PRIMARY KEY]

table_constraints:
  [{INDEX|KEY} [index_name] (column_name|column_name->'$.json_path'|column_name->'$[*]')][,...]
  [FULLTEXT [INDEX|KEY] [index_name] (column_name) [index_option]] [,...]
  [PRIMARY KEY [index_name] (column_name,...)]
  [CLUSTERED KEY [index_name] (column_name[ASC|DESC],...) ]
  [[CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)][,...]
  [ANN INDEX [index_name] (column_name,...) [index_option]] [,...]

table_attribute:
  DISTRIBUTED BY HASH(column_name,...) | DISTRIBUTED BY BROADCAST

partition_options:
  PARTITION BY 
        {VALUE(column_name) | VALUE(DATE_FORMAT(column_name, 'format')) | VALUE(FROM_UNIXTIME(column_name, 'format'))}
  LIFECYCLE N
  
 index_all:
 INDEX_ALL= 'Y|N'

storage_policy:
  STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' {hot_partition_count=N}}

block_size:
  BLOCK_SIZE= VALUE

engine:
  ENGINE= 'XUANWU|XUANWU_V2'
説明

デフォルトでは、AnalyticDB for MySQL の内部テーブルは zstd 圧縮アルゴリズムを使用します。

パラメーター

table_name、column_name、column_type、および COMMENT

パラメーター

説明

table_name

テーブルの名前。テーブル名は 1 ~ 127 文字の長さで、文字、数字、およびアンダースコア(_)を含めることができます。テーブル名は、文字またはアンダースコア(_)で始まる必要があります。

db_name.table_name 形式を使用して、データベースに作成するテーブルを指定できます。

column_name

テーブルに追加する列の名前。列名は 1 ~ 127 文字の長さで、文字、数字、およびアンダースコア(_)を含めることができます。列名は、文字またはアンダースコア(_)で始まる必要があります。

column_type

列のデータ型。AnalyticDB for MySQL でサポートされているデータ型の詳細については、基本データ型複合データ型 を参照してください。

COMMENT

列またはテーブルのコメント。

column_attributes (DEFAULT | AUTO_INCREMENT)

DEFAULT {constant | CURRENT_TIMESTAMP}

列のデフォルト値を指定します。デフォルト値は、定数 または CURRENT_TIMESTAMP 関数です。他の関数またはバリアント式はサポートされていません。

値を指定しない場合、列のデフォルト値は NULL です。

AUTO_INCREMENT

自動インクリメント列を指定します。自動インクリメント列は、BIGINT 型である必要があります。

AnalyticDB for MySQL は、自動インクリメント列に一意の値を割り当てます。ただし、これらの値は連続していない場合があり常に 1 から始まるわけではありません

: 自動インクリメント列を含むテーブルにデータを挿入する場合は、列名を明示的に指定することをお勧めします。例: INSERT INTO table (column1,column2) VALUES (value1,value2)。これにより、列の数またはシーケンスの不一致によって発生する Insert query has mismatched column sizes などのエラーメッセージを防ぐことができます。

column_constraints (NOT NULL | PRIMARY KEY)

NOT NULL

NOT NULL 列を指定します。この列には、NULL 値を含めることができません。NULL として指定された列、または NOT NULL として指定されていない列には、NULL 値を含めることができます。

PRIMARY KEY

プライマリキーを指定します。列制約を使用して、1 つの列のみをプライマリキーとして指定できます。たとえば、id BIGINT NOT NULL PRIMARY KEY を使用して、id 列をプライマリキーとして指定できます。複数の列をプライマリキーとして指定するには、table_constraints で複合プライマリキーを使用します。

table_constraints (インデックス)

AnalyticDB for MySQL は、INDEX、PRIMARY KEY、CLUSTERED KEY、FOREIGN KEY、FULLTEXT INDEX、ANN INDEX など、さまざまなインデックスをサポートしています。テーブルには、1 つ以上のタイプのインデックスを含めることができます。

INDEX | KEY

標準インデックスを指定します。INDEX と KEY は同じ意味で使用できます。

  • XUANWU_V2 テーブルの場合、AnalyticDB for MySQL は、デフォルトではテーブルのすべての列にインデックスを作成しません。テーブルにプライマリキーが指定されている場合、AnalyticDB for MySQL は、デフォルトではプライマリキーにのみ標準インデックスを作成します。

  • XUANWU テーブルの場合、デフォルトではテーブルのすべての列にインデックスが作成されます。ただし、XUANWU テーブルを作成するときに特定の列にインデックスを作成する場合(INDEX (id) を使用して id 列にインデックスを作成する場合など)、AnalyticDB for MySQL は、テーブルの他の列にインデックスを自動的に作成しません。

: INDEX (column1,column2) を使用して複数の列に複合インデックスを作成することはできません。

PRIMARY KEY

プライマリキーインデックスを指定します。

概要

  • 各テーブルには、プライマリキーを 1 つだけ設定できます。

  • プライマリキーは、PRIMARY KEY (id) などの単一の列、または PRIMARY KEY (id,name) などの複数の列で構成できます。

  • 複合プライマリキーには、分散キーとパーティションキー含める必要があります分散キーとパーティションキーは、複合プライマリキーの前方に配置することをお勧めします。

使用上の注意

  • プライマリキーのないテーブルでは、DELETE 操作または UPDATE 操作を実行できません。

  • プライマリキーを指定しない場合、次のルールが適用されます。

    • 分散キーを指定しない場合、AnalyticDB for MySQL は、テーブルに 列を自動的に追加し、その列をプライマリキーと分散キー__adb_auto_id__プライマリキーと分散キーとして使用します。

    • 分散キーが指定されている場合、AnalyticDB for MySQL プライマリキーを自動的に追加しません

  • テーブルの作成後、プライマリキー列を追加、削除、または変更することはできません。

高いパフォーマンスを確保するために、1 つまたは少数の数値列をプライマリキーとして選択することをお勧めします。

説明

テーブルに過剰なプライマリキー列がある場合、次の問題が発生する可能性があります。

  • CPU と I/O リソースの消費量の増加。これは、AnalyticDB for MySQL がデータの書き込み時に重複するプライマリキー値が存在するかどうかを確認するためです。

  • プライマリキーインデックスのディスク使用量の増加。プライマリキーインデックスのディスク使用量を表示するには、スペースの分析 機能を使用します。

  • BUILD ジョブのパーティション再構築速度の低下。

クラスタードキー

クラスタードインデックスを指定します。クラスタードインデックスはパーティションレベルで構成されます。これは、データが格納される物理的な順序を決定します。パーティション内のデータは、クラスタードインデックスの値に基づいてソートされ、順番に格納されます。デフォルトでは、データは昇順にソートおよび格納されます。クラスタードインデックスのキー値が同じか類似しているデータレコードは、同じか隣接したデータブロックに格納されます。範囲クエリまたは等価フィルタリングでは、クラスタードインデックスを使用すると、ディスク I/O を削減し、データの読み取りを高速化できます。これは、クエリ条件がクラスタードインデックス列と同じ場合、ストレージエンジンが連続したデータブロックを読み取ることができるためです。

image

適用可能なシナリオ

クラスタードインデックスは、範囲クエリ等価フィルタリングでうまく機能します。範囲クエリまたは等価フィルタリングの条件で頻繁に使用される列は、理想的なクラスタードインデックス列です。

クエリ条件がクラスタードインデックス列と一致するか部分的に一致する場合、読み取り効率が大幅に向上します。たとえば、SaaS(Software-as-a-Service)アプリケーションでユーザー ID をクラスタードインデックスとして使用できます。これにより、特定のユーザー ID のレコードが同じか連続したデータブロックに格納され、データクエリのパフォーマンスが向上します。

使用上の注意

  • 各テーブルには、クラスタードインデックスを 1 つだけ設定できます。

  • クラスタードインデックスは、CLUSTERED KEY index(id)などの単一の列、またはCLUSTERED KEY index(id,name)などの複数の列に作成できます。クラスタードインデックスに 2 つの列が関係する場合、データは最初に最初のクラスタードインデックス列の値に基づいてソートされます。最初のクラスタードインデックス列の値が同じ場合、データは 2 番目のクラスタードインデックス列の値に基づいてソートされます。したがって、CLUSTERED KEY index(id,name)CLUSTERED KEY index(name,id)は異なるクラスタードインデックスです。

  • デフォルトでは、クラスタードインデックスは昇順にソートされ、昇順クエリに適しています。クエリが降順の場合、テーブルを作成するときにクラスタードインデックスの順序を降順に設定します(例:CLUSTERED KEY index(id) DESC)。既存のテーブルからデータをクエリする場合、既存のクラスタードインデックスを削除し、降順のクラスタードインデックスを作成できます。

  • ソートパフォーマンスの低下を防ぐため、クラスタードインデックスで値が長い列(10 KB を超える文字列など)を使用しないことをお勧めします。

フルテキストインデックス | フルテキストキー

フルテキストインデックスを指定します。

構文とパラメーター

構文: [FULLTEXT [INDEX|KEY] [index_name] (column_name) [index_option]] [,...]

パラメーター

外部キー

外部キーインデックスを指定します。外部キーインデックスは、不要な結合を排除するために使用されます。

構文とパラメーター

サポートされているバージョン

V3.1.10 以降AnalyticDB for MySQL クラスタのみが FOREIGN KEY 句をサポートしています。

説明

AnalyticDB for MySQL クラスタのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。

構文: [[CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)][,...]

パラメーター

  • symbol: 外部キー制約の名前。名前はテーブル内で一意である必要があります。このパラメーターはオプションです。このパラメーターを指定しない場合、パーサーは自動的に外部キー列の名前に _fk を追加した名前を外部キー制約の名前として使用します。

  • fk_column_name: 外部キー列の名前。列はすでに存在している必要があります。

  • pk_table_name: 親テーブルの名前。親テーブルはすでに存在している必要があります。

  • pk_column_name: 外部キー制約列の名前。これは親テーブルのプライマリキー列です。列はすでに存在している必要があります。

使用上の注意

  • 各テーブルは複数の外部キーインデックスを持つことができます。

  • 外部キーインデックスは、FOREIGN KEY (sr_item_sk, sr_ticket_number) REFERENCES store_sales(ss_item_sk,d_date_sk) のように、複数の列で構成することはできません。

  • AnalyticDB for MySQL はデータ制約をチェックしません。親テーブルのプライマリキーと関連付けられたテーブルの外部キーの間のデータ制約関係を確認する必要があります。

  • 外部テーブルに外部キー制約を追加することはできません。

ANN インデックス

ベクターインデックスを指定します。

注記:XUANWU_V2 テーブルのベクターインデックスは作成できません。

構文とパラメーター

構文[ANN INDEX [index_name] (column_name,...) [index_option]] [,...]

パラメーター

  • index_name: ベクターインデックスの名前。

  • column_name: ベクター列の名前。ベクター列は、ARRAY<FLOAT>、ARRAY<SMALLINT>、ARRAY<BYTE> のいずれかの型である必要があります。ベクターの次元を指定する必要があります。たとえば、次の構文を使用して、feature という名前の ARRAY<FLOAT> 型の 4 次元ベクター列を作成できます。feature array<float>(4)

  • index_option: ベクターインデックスの属性。

    • algorithm: ベクター間の距離を計算するための数式で使用されるアルゴリズム。値を HNSW_PQ に設定します。これは、ベクターの次元に敏感で、テーブルごとに 100 万から 1,000 万レコードを含む中規模のデータセットに適しています。

    • dis_function: ベクター間の距離を計算するために使用される数式。値を SquaredL2 に設定します。計算式:(x1 - y1)^2 + (x2 - y2)^2 + ...

JSON インデックス

JSON インデックスまたは JSON 配列インデックスを指定します。

構文とパラメーター

JSON インデックス

サポートされているバージョン

  • V3.1.5.10 以降の AnalyticDB for MySQL クラスターの場合、テーブルの作成後に JSON インデックスは自動的に作成されません。JSON インデックスを手動で作成する必要があります。

  • V3.1.5.10 より前の AnalyticDB for MySQL クラスターの場合、テーブルの作成後に JSON 列の JSON インデックスが自動的に作成されます。

説明

AnalyticDB for MySQL クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。

構文[INDEX [index_name] (column_name|column_name->'$.json_path')]

パラメーター

  • index_name: インデックスの名前。

  • column_name | column_name->'$.json_path':

    • column_name: JSON インデックスを作成する列の名前。

    • column_name->'$.json_path': JSON 列とそのプロパティキー。各 JSON インデックスには、JSON 列のプロパティキーが 1 つだけ含まれます。

      重要
      • V3.1.6.8 以降の AnalyticDB for MySQL クラスターのみが column_name->'$.json_path パラメーターをサポートしています。

      • JSON 列に既にインデックスがある場合は、JSON 列のインデックスを削除してから、JSON 列のプロパティキーのインデックスを作成する必要があります。

JSON 配列インデックス

サポートされているバージョン

V3.1.10.6 以降の AnalyticDB for MySQL クラスターのみが JSON 配列インデックスをサポートしています。

説明

AnalyticDB for MySQL クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。

構文[INDEX [index_name] (column_name->'$[*]')]

パラメーター

  • index_name: インデックスの名前。

  • column_name->'$[*]': JSON 配列インデックスを作成する列の名前。たとえば、vj->'$[*]' は、vj 列に JSON 配列インデックスを作成するために使用されます。

table_attribute (分散キー)

テーブルが標準テーブルかレプリケートテーブルかを決定します。

  • DISTRIBUTED BY HASH: テーブルを標準テーブルとして指定します。標準テーブルは、分散システムのクエリ機能を最大限に活用して、クエリ効率を向上させることができます。各標準テーブルには、最大数百億件のデータレコードを格納できます。

  • DISTRIBUTED BY BROADCAST: テーブルをレプリケートテーブルとして指定します。レプリケートテーブルは、テーブルが属する AnalyticDB for MySQL クラスタの各シャードにデータレプリカを格納します。各レプリケートテーブルには最大 20,000 行を格納することをお勧めします。

DISTRIBUTED BY HASH (column_name,...)

テーブルの分散キーを指定します。分散キーを持つテーブルは、パーティションテーブル (標準テーブル) です。AnalyticDB for MySQL は、分散キーのハッシュ値を計算し、ハッシュ値に基づいてテーブルをシャードに分割します。シャーディングは、スケーラビリティとクエリパフォーマンスを向上させます。

image

概要

  • 各テーブルには、分散キーを 1 つだけ指定できます。

  • 各分散キーには、1 つ以上の列を含めることができます。

  • 分散キー列は、プライマリキー列に含まれている必要があります。たとえば、分散キーが customer_id 列の場合、プライマリキーには customer_id 列が含まれている必要があります。

使用上の注意

  • テーブルの作成時に分散キーを指定しない場合は、次のルールが適用されます。

    • テーブルにプライマリキーがある場合、AnalyticDB for MySQLプライマリキーを分散キーとして使用します

    • テーブルにプライマリキーがない場合、AnalyticDB for MySQL はテーブルに 列を自動的に追加し、その列をプライマリキーと分散キー__adb_auto_id__プライマリキーと分散キーとして使用します。

  • テーブルが作成された後、分散キー列を追加、削除、または変更することはできません。分散キーを変更するには、必要な分散キーを持つテーブルを作成し、データを新しいテーブルに移行する必要があります。

推奨事項

  • 列の数を少なく選択すると、さまざまな複雑なクエリに対して分散キーがより適したものになります。

  • 値が均等に分散されている列を分散キーとして選択します。たとえば、トランザクション ID、デバイス ID、ユーザー ID、または自動増分列などです。ただし、これらの列は、クエリ条件が少数の列値に限定されている場合は、理想的な分散キーではありません。たとえば、列 A の値が均等に分散されているが、クエリ条件が常に A=3 の場合、列 A を分散キーとして設定すると、データホットスポットが発生します。

  • テーブルを結合するために使用できる列を分散キーとして選択します。こうすることで、結合された 2 つのテーブルで同じ分散キー値を持つデータが同じシャードに分散されます。結合操作は、シャード間でデータを送信する必要なく、同じシャードで実行されます。これにより、データの再分散が最小限に抑えられ、クエリのパフォーマンスが向上します。たとえば、ユースケースで顧客の注文履歴をクエリする場合、customer_id 列を分散キーとして指定できます。

  • 日付、時刻、およびタイムスタンプ型の列を分散キーとして選択しないでください。前述の列は、データ書き込み中にデータの偏りが発生しやすく、書き込みパフォーマンスが低下する可能性があります。ほとんどのクエリは、1 日や 1 か月などの期間に限定されます。この場合、クエリするデータは 1 つのノードにのみ存在する可能性があり、クエリは分散データベースシステム内のすべてのノードの処理能力を活用できません。日付型と時刻型の列は、パーティションキーとして選択することをお勧めします。

  • ストレージ診断機能を使用して、列が適切な分散キーであるかどうか、およびデータの偏りが発生しているかどうかを確認できます。

ブロードキャストによる分散

レプリケートテーブルを指定します。レプリケートテーブルは、テーブルが属する AnalyticDB for MySQL クラスタの各シャードにデータレプリカを格納します。各レプリケートテーブルには大量のデータを格納しないことをお勧めします。

利点:JOIN クエリを実行する場合、異なるノード間でレプリケートテーブルのデータを送信する必要はありません。これにより、ネットワーク送信のオーバーヘッドが大幅に削減され、高並列シナリオでのクラスタの安定性が向上します。

欠点:レプリケートテーブルで INSERT、UPDATE、および DELETE 操作を実行した後にデータが変更されると、データの整合性を確保するために、これらの変更はクラスタのすべてのノードにブロードキャストされます。ただし、これは全体的な書き込みパフォーマンスに影響します。そのため、レプリケートテーブルを頻繁に作成、削除、または変更しないことをお勧めします。

partition_options (パーティションキーとライフサイクル)

テーブルに分散キーを指定した後に、1 つのシャードに大量のデータが含まれている場合は、シャードをパーティションに分割してデータフィルタリングを高速化し、クエリのパフォーマンスを向上させることができます。

メリット

  • パーティション分割は、次の理由により、データフィルタリングを高速化し、クエリのパフォーマンスを向上させます。

    • パーティションプルーニング機能を使用してクエリ速度を向上させます。パーティションプルーニング機能により、システムはクエリに関連するデータを含むパーティションのみをスキャンできます。これにより、クエリ速度が向上します。

    • インデックススキャンのパフォーマンスを向上させます。5,000 万行など、過剰な数の行を含むテーブルがパーティション分割されていない場合、インデックススキャンの効率は低くなります。テーブルがパーティション分割されている場合、パーティションごとにインデックスが作成されます。これにより、より効率的なインデックススキャンが可能になります。

    • BUILD タスクの効率を高めます。BUILD タスクを使用して、リアルタイムで書き込まれたデータを履歴データに変換できます。このプロセス中に、システムはパーティションとインデックスを作成し、冗長データをクリアします。インデックスは、BUILD タスクが完了した後にのみ有効になります。テーブルがパーティション分割されていない場合、BUILD タスクごとにテーブル全体がスキャンされます。テーブルに含まれるレコードが多いほど、プロセスにかかる時間が長くなり、新しいインデックスが有効になるのが遅くなります。これはクエリのパフォーマンスに影響します。テーブルがパーティション分割されている場合、BUILD タスクごとにデータが変更されたパーティションのみがスキャンされます。これにより、BUILD タスクの効率が向上します。

  • パーティション分割は、データライフサイクル管理を容易にします。

  • パーティション分割は、異なるストレージポリシーに基づいて、ホットデータとコールドデータの階層型ストレージを実装するのに役立ちます。

image

PARTITION BY

パーティションキーを指定します。

構文: PARTITION BY VALUE {(column_name)|(DATE_FORMAT(column_name, 'format'))|(FROM_UNIXTIME(column_name, 'format'))} LIFECYCLE n

パラメーター

  • column_name: パーティションキーの名前。PARTITION BY VALUE(column_name) 構文では、パーティション分割は column_name 列の値に基づいています。パーティションキーには、数値日時、または数値を指定する文字列のいずれかの型を指定できます。

  • DATE_FORMAT(column_name, 'format'))|FROM_UNIXTIME(column_name, 'format'): DATE_FORMAT() 関数または FROM_UNIXTIME() 関数を使用して日時列を特定の日付形式に変換し、データをパーティション分割します。指定された日付形式は、年、月、日のみを %Y、%y、%Y%m、%y%m、%Y%m%d、%y%m%d の形式でサポートします。テーブルの作成後、ALTER TABLE 文を実行することで形式を変更できます。

    • column が BIGINT、TIMESTAMP、DATETIME、または VARCHAR 型の場合、DATE_FORMAT() 関数を使用する必要があります。BIGINT 列の例: 1734278400000(ミリ秒単位の UNIX タイムスタンプ)。TIMESTAMP、DATETIME、または VARCHAR 列の例: 2024-11-26 00:01:02。

    • column が INT 型の場合、FROM_UNIXTIME() 関数を使用する必要があります。例: 1696266000(秒単位の UNIX タイムスタンプ)。

使用上の注意

  • V3.2.1.0 より前の AnalyticDB for MySQL クラスターの場合、 句を使用してパーティションキーを指定する場合は、LIFECYCLE nパーティションのライフサイクルを指定するPARTITION BY パラメーターを使用してパーティションのライフサイクルを指定する必要があります。指定しないと、エラーが発生します。

  • V3.2.1.0 以降の AnalyticDB for MySQL クラスターの場合、 句を使用して場合、LIFECYCLE n パラメーターはオプションPARTITION BYパーティションキーを指定するです。 LIFECYCLE n パラメーターを指定しない場合、パーティションデータは削除されません。

  • テーブルの作成後、パーティションキーを追加したり、パーティションキー列を追加、削除、または変更したりすることはできません。パーティションキーを追加または変更するには、目的のパーティションキーを持つテーブルを作成し、データを新しいテーブルに移行します。詳細については、「ALTER TABLE」をご参照ください。

推奨事項

  • パーティションキーには日時列を使用することをお勧めします。

  • パーティションが大きすぎる、または小さすぎると、読み取り/書き込みパフォーマンス、さらにはクラスターの安定性に影響を与える可能性があります。推奨されるパーティションサイズとパーティションフィールドの妥当性の基準については、ストレージ診断トピックの「パーティションテーブルの診断」セクションをご参照ください。

  • 履歴パーティションのデータを頻繁に更新しないことをお勧めします。履歴パーティションのデータを頻繁に更新する場合は、パーティションキーを変更する必要がある場合があります。

LIFECYCLE n

PARTITION BY 句とともに LIFECYCLE n パラメーターを使用する必要があります。このパラメーターを使用して、パーティションのライフサイクルを管理できます。AnalyticDB for MySQL は、パーティションキーの値に基づいてパーティションを降順にソートします。最初の n 個のパーティションは保持され、他のパーティションは削除されます。

  • V3.2.1.1 より前の AnalyticDB for MySQL クラスターの場合、LIFECYCLE n パラメーターは、各シャードに最大 n 個のパーティションを保持できることを指定します。パーティションのライフサイクルはシャードレベルで管理されます。ただし、データの分布が不均一である場合、またはデータ量が非常に少ない場合は、特定のシャードに n 個を超えるパーティションが保持される場合があります。

  • V3.2.1.1 以降の AnalyticDB for MySQL クラスターの場合、パーティションのライフサイクルはテーブルレベルで管理されます。LIFECYCLE n パラメーターは、各テーブルに最大 n 個のパーティションを保持できることを指定します。ただし、AnalyticDB for MySQL クラスターが V3.2.1.1 以降に更新される前に作成されたテーブルの場合、パーティションのライフサイクルはシャードレベルで管理されます。LIFECYCLE n パラメーターは、各シャードに最大 n 個のパーティションを保持できることを指定します。

PARTITION BY VALUE (DATE_FORMAT(date, '%Y%m%d')) LIFECYCLE 30 は、パーティション分割中に、date 列のデータが yyyyMMdd 形式に変換され、最大 30 個のパーティションが保持されることを指定します。1 日目から 30 日目までのデータが、パーティション 20231201 からパーティション 20231230 までの対応するパーティションに書き込まれるとします。31 日目にパーティション 20231231 にデータが書き込まれると、最大 30 個のパーティションしか保持できないため、パーティションキーの値が最も小さいパーティション(パーティション 20231201)が自動的に削除されます。

INDEX_ALL(すべての列にインデックスを作成)

テーブルのすべての列にインデックスを作成するかどうかを指定します。

有効な値:

  • Y: すべての列にインデックスを作成します。XUANWU テーブルの場合、デフォルト値は Y です。

  • N: プライマリキーにのみインデックスを作成します。XUANWU_V2 テーブルの場合、デフォルト値は N です。

STORAGE_POLICY (ストレージポリシー)

Enterprise Edition、Basic Edition、および Data Lakehouse Edition クラスターと、Cluster Edition のためのエラスティックモードの Data Warehouse Edition クラスターでは、データストレージポリシーを指定できます。ストレージポリシーは、読み取り/書き込みパフォーマンスとストレージコストが異なります。

有効な値:

  • hot (デフォルト): ホットストレージ。テーブル全体のすべてのパーティションのデータは SSD に保存されます。ホットストレージは読み取り/書き込みパフォーマンスが最も優れていますが、ストレージコストが最も高くなります。

  • cold: コールドストレージ。テーブル全体のすべてのパーティションのデータは Object Storage Service (OSS) に保存されます。ホットストレージと比較して、コールドストレージは読み取り/書き込みパフォーマンスが低いですが、最も低コストのオプションです。

  • mixed: ホットストレージとコールドストレージの組み合わせ。階層化ストレージとも呼ばれます。このポリシーは、頻繁にアクセスされるデータ (ホットデータ) を SSD に保存し、アクセス頻度の低いデータ (コールドデータ) を OSS に保存することで、ストレージコストを削減し、クエリパフォーマンスを確保します。STORAGE_POLICY パラメーターを mixed に設定する場合は、PARTITION BY 句を使用してパーティションキーを指定し、hot_partition_count パラメーターを使用してホットパーティションの数を指定する必要があります。パーティションキーを指定しない場合、階層化ストレージは有効にならず、データは SSD に保存されます。

    階層化ストレージの例

    image

hot_partition_count (ホットパーティション)

STORAGE_POLICY パラメーターを mixed に設定した場合、hot_partition_count=n (n は正の整数) を使用してホットパーティションの数を指定する必要があります。AnalyticDB for MySQL は、パーティションキーの値に基づいてレコードを降順にソートします。最初の n 個のパーティションはホットパーティションで、残りのパーティションはコールドパーティションです。

説明

STORAGE_POLICY パラメーターを mixed 以外の値に設定し、hot_partition_count=n を使用すると、エラーが発生します。

block_size (データブロック)

データブロックは、データの読み取りおよび書き込みのための最小 I/O 単位です。BLOCK_SIZE パラメーターは、列指向ストレージの各データブロックに格納される行数を指定します。このパラメーターは、各 I/O 操作で読み取られる行数を決定し、クエリの特性に基づいてクエリのパフォーマンスに影響します。たとえば、ポイントクエリに対して BLOCK_SIZE が大きい値に設定されている場合、ブロックはストレージシステムによって非効率的に読み取られます。この場合、BLOCK_SIZE の値を適切に小さくすることができます。

デフォルト値:

  • レプリケートテーブルのデフォルト値: 4096

  • 32 コア未満のスタンドアロンエディション用のエラスティックモードの AnalyticDB for MySQL Data Warehouse Edition クラスタのデフォルト値: 8192

  • その他のケースのデフォルト値: 32760。BLOCK_SIZE のデフォルト値が 32760 の場合、SHOW CREATE TABLE 文を実行しても BLOCK_SIZE は表示されません。

重要

列指向ストレージに慣れていない場合は、BLOCK_SIZE の値を変更しないことをお勧めします。

エンジン(ストレージエンジン)

AnalyticDB for MySQL 内部テーブルのストレージエンジンの種類を指定します。履歴データ分析にストレージエンジンを使用できます。

  • V3.2.2.0 より前の AnalyticDB for MySQL クラスタの場合、値を XUANWU に設定します。 ENGINE パラメーターを明示的に指定しない場合、XUANWU が使用されます。

    重要

    V3.1.9.5 より前のバージョンでは、内部テーブルの作成時に ENGINE='XUANWU' を明示的に指定する場合、table_properties='{"format":"columnstore"}' も明示的に指定する必要があります。指定しないと、テーブルの作成に失敗します。

  • V3.2.2.0 以後の AnalyticDB for MySQL クラスタの有効な値:

    • RC_DDL_ENGINE_REWRITE_XUANWUV2 が true に設定されている場合:XUANWU_V2。

    • RC_DDL_ENGINE_REWRITE_XUANWUV2 が false に設定されている場合:XUANWU_V2 および XUANWU。

    SHOW ADB_CONFIG KEY=RC_DDL_ENGINE_REWRITE_XUANWUV2; 文を実行して、このパラメーターの値をクエリできます。また、クラスタレベルまたはテーブルレベルで RC_DDL_ENGINE_REWRITE_XUANWUV2 の値を変更する こともできます。

AS query_expr (CTAS)

CREATE TABLE AS query_expr は、テーブルを作成し、クエリされたデータを新しいテーブルに書き込むために使用できます。詳細については、「CREATE TABLE AS SELECT (CTAS)」をご参照ください。

日付で自動的にパーティション化されたパーティションテーブルを作成する

sale_time ボリュームの日付値で自動的にパーティション化される sales という名前のパーティションテーブルを作成します。

CREATE TABLE sales (
  sale_id BIGINT NOT NULL COMMENT '注文 ID',
  customer_id VARCHAR NOT NULL COMMENT '顧客 ID',
  phone_num BIGINT NOT NULL COMMENT '電話番号',
  revenue DECIMAL(15, 2) COMMENT '合計金額',
  sale_time TIMESTAMP NOT NULL COMMENT '注文時間',
  PRIMARY KEY (sale_time,sale_id)
 )
DISTRIBUTED BY HASH(sale_id)
PARTITION BY VALUE(DATE_FORMAT(sale_time, '%Y%m%d'));                   

パーティションライフサイクルが設定されたパーティションテーブルを作成する

customer という名前のパーティションテーブルを作成します。login_timecustomer_id、および phone_num を複合プライマリキーとして、customer_id を分散キーとして、login_time をパーティションキーとして指定します。パーティションライフサイクルを 30 に設定します。

すべてのパーティションは、login_time パーティションキーの値に基づいて降順にソートされます。最初の 30 個のパーティションのみが保持されます。31 番目のパーティションにデータが書き込まれると、パーティションキーの値が最も小さいパーティションが自動的に削除されます。

1 日目(login_time 値 20231201)から 30 日目(login_time 値 20231230)までのデータが、パーティション 20231201 からパーティション 20231230 までの対応するパーティションに書き込まれるとします。31 日目に login_time 値 20231231 のデータがデータベースに書き込まれると、login_time 値が最も小さいパーティション(パーティション 20231201)が自動的に削除されます。このようにして、過去 30 日以内のデータのみが保持されます。

CREATE TABLE customer (
  customer_id BIGINT NOT NULL COMMENT '顧客 ID',
  customer_name VARCHAR NOT NULL COMMENT '顧客名',
  phone_num BIGINT NOT NULL COMMENT '電話番号',
  city_name VARCHAR NOT NULL COMMENT '市',
  sex INT NOT NULL COMMENT '性別',
  id_number VARCHAR NOT NULL COMMENT 'ID カード番号',
  home_address VARCHAR NOT NULL COMMENT '自宅住所',
  office_address VARCHAR NOT NULL COMMENT '勤務先住所',
  age INT NOT NULL COMMENT '年齢',
  login_time TIMESTAMP NOT NULL COMMENT 'ログオン時間',
  PRIMARY KEY (login_time,customer_id,phone_num)
 )
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT '顧客情報テーブル';                   

非パーティションテーブルを作成する

分散キーまたはパーティションキーのない非パーティションテーブルを作成する

プライマリキーはあるが分散キーがないテーブルを作成する場合、AnalyticDB for MySQL はプライマリキーを分散キーとして自動的に使用します。

CREATE TABLE orders (
  order_id BIGINT NOT NULL COMMENT '注文 ID',
  customer_id INT NOT NULL COMMENT '顧客 ID',
  order_status VARCHAR(1) NOT NULL COMMENT '注文ステータス',
  total_price DECIMAL (15, 2) NOT NULL COMMENT '合計金額',
  order_date DATE NOT NULL COMMENT '注文日',
  PRIMARY KEY(order_id,order_date)
);

テーブルの作成に使用された文をクエリし、プライマリキー列 order_id と order_date が分散キーとして使用されていることを確認します。

SHOW CREATE TABLE orders;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                  | 
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| orders  | CREATE TABLE `orders` (                                                                                                                       |
|         | 'order_id' bigint NOT NULL COMMENT '注文 ID',                                                                                                   |
|         | 'customer_id' int NOT NULL COMMENT '顧客 ID',                                                                                                   |
|         | 'order_status' varchar(1) NOT NULL COMMENT '注文ステータス',                                                                                         | 
|         | 'total_price' decimal(15, 2) NOT NULL COMMENT '合計金額',                                                                                      |
|         | 'order_date' date NOT NULL COMMENT '注文日',                                                                                                 |
|         | PRIMARY KEY (`order_id`,`order_date`)                                                                                                         |
|         | ) DISTRIBUTED BY HASH(`order_id`,`order_date`) INDEX_ALL='Y' STORAGE_POLICY='HOT' ENGINE='XUANWU' TABLE_PROPERTIES='{"format":"columnstore"}'  |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)

プライマリキーまたは分散キーのない非パーティションテーブルを作成する

プライマリキーまたは分散キーのないテーブルを作成する場合、AnalyticDB for MySQL__adb_auto_id__ 列をテーブルに追加し、その列をプライマリキーおよび分散キーとして使用します。

CREATE TABLE orders_new (
  order_id BIGINT NOT NULL COMMENT '注文 ID',
  customer_id INT NOT NULL COMMENT '顧客 ID',
  order_status VARCHAR(1) NOT NULL COMMENT '注文ステータス',
  total_price DECIMAL (15, 2) NOT NULL COMMENT '合計金額',
  order_date DATE NOT NULL COMMENT '注文日'
);

テーブルの作成に使用された文をクエリし、__adb_auto_id__ という名前の自動インクリメント列がテーブルに自動的に追加され、プライマリキーおよび分散キーとして使用されていることを確認します。

SHOW CREATE TABLE orders_new;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                  | 
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| orders_new  | CREATE TABLE `orders_new` (                                                                                                                   |
|             | `__adb_auto_id__` bigint AUTO_INCREMENT,                                                                                                      |
|             | 'order_id' bigint NOT NULL COMMENT '注文 ID',                                                                                                   |
|             | 'customer_id' int NOT NULL COMMENT '顧客 ID',                                                                                                   |
|             | 'order_status' varchar(1) NOT NULL COMMENT '注文ステータス',                                                                                         | 
|             | 'total_price' decimal(15, 2) NOT NULL COMMENT '合計金額',                                                                                      |
|             | 'order_date' date NOT NULL COMMENT '注文日',                                                                                                 |
|             | PRIMARY KEY (`__adb_auto_id__`)                                                                                                               |
|             | ) DISTRIBUTED BY HASH(`__adb_auto_id__`) INDEX_ALL='Y' STORAGE_POLICY='HOT' ENGINE='XUANWU' TABLE_PROPERTIES='{"format":"columnstore"}'        |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)

プライマリキーと分散キーはあるがパーティションキーのない非パーティションテーブルを作成する

supplier_id 自動インクリメント列を分散キーとして使用し、supplier_id 値のハッシュ値に基づいてシャーディングされる supplier という名前のテーブルを作成します。

CREATE TABLE supplier (
  supplier_id BIGINT AUTO_INCREMENT PRIMARY KEY,
  supplier_name VARCHAR,
  address INT,
  phone VARCHAR
) 
DISTRIBUTED BY HASH(supplier_id);

ストレージポリシーを指定する

コールドストレージポリシーを指定する

CREATE TABLE item (
  order_id BIGINT NOT NULL,
  item_id INT NOT NULL,
  quantity DECIMAL(15, 2) NOT NULL,
  discount DECIMAL(15, 2) NOT NULL,
  shipdate DATE NOT NULL,
  PRIMARY KEY (order_id,item_id,shipdate)
) 
DISTRIBUTED BY HASH(item_id) 
PARTITION BY VALUE(date_format(shipdate, '%Y%m')) LIFECYCLE 200 
STORAGE_POLICY='COLD';

ホットストレージポリシーを指定する

CREATE TABLE item (
  order_id BIGINT NOT NULL,
  item_id INT NOT NULL,
  quantity DECIMAL(15, 2) NOT NULL,
  discount DECIMAL(15, 2) NOT NULL,
  shipdate DECIMAL NOT NULL,
  PRIMARY KEY (order_id,item_id,shipdate)
) 
DISTRIBUTED BY HASH(item_id) 
PARTITION BY VALUE(date_format(shipdate, '%Y%m')) LIFECYCLE 200 
STORAGE_POLICY='HOT';

階層型ストレージポリシーを指定し、ホットパーティションの数を 16 に設定する

CREATE TABLE item (
  order_id BIGINT NOT NULL,
  item_id INT NOT NULL,
  quantity DECIMAL(15, 2) NOT NULL,
  discount DECIMAL(15, 2) NOT NULL,
  shipdate DATE NOT NULL,
  PRIMARY KEY (order_id,item_id,shipdate)
) 
DISTRIBUTED BY HASH(item_id) 
PARTITION BY VALUE(date_format(shipdate, '%Y%m')) LIFECYCLE 200  
STORAGE_POLICY='MIXED' HOT_PARTITION_COUNT=16;

特定の列に通常のインデックスを作成する

id 列と date 列に通常のインデックスを作成します。

CREATE TABLE index_tb (
  id INT,
  sales DECIMAL(15, 2),
  date DATE,
  INDEX (id),
  INDEX (date),
  PRIMARY KEY (id)
) 
DISTRIBUTED BY HASH(id);

フルテキストインデックスを指定する

content 列に fidx_c という名前のフルテキストインデックスを作成します。

CREATE TABLE fulltext_tb (
  id INT,
  content VARCHAR,
  keyword VARCHAR,
  FULLTEXT INDEX fidx_c(content),
  PRIMARY KEY (id)
) 
DISTRIBUTED BY HASH(id);

フルテキストインデックスを作成および変更する方法については、『フルテキストインデックスを作成する』トピックの「既存のテーブルのフルテキストインデックスを作成する」セクションをご参照ください。

フルテキスト検索については、「フルテキスト検索」をご参照ください。

ベクタインデックスを指定する

short_feature という名前の ARRAY<SMALLINT> 型の 4 次元ベクタ列と、float_feature という名前の ARRAY<FLOAT> 型の 4 次元ベクタ列を持つテーブルを作成します。

テーブルのベクタ列に、short_feature_index と float_feature_index という名前のベクタインデックスを作成します。

CREATE TABLE fact_tb (  
  xid BIGINT NOT NULL,  
  cid BIGINT NOT NULL,  
  uid VARCHAR NOT NULL,  
  vid VARCHAR NOT NULL,  
  wid VARCHAR NOT NULL,  
  short_feature array<smallint>(4),  
  float_feature array<float>(4),  
  ann index short_feature_index(short_feature), 
  ann index float_feature_index(float_feature),  
  PRIMARY KEY (xid, cid, vid)
) 
DISTRIBUTED BY HASH(xid) PARTITION BY VALUE(cid) LIFECYCLE 4;

ベクタインデックスとベクタ検索の詳細については、「ベクタ検索」をご参照ください。

外部キーインデックスを指定する

store_returns という名前のテーブルを作成します。FOREIGN KEY 句を使用して、store_returns テーブルの sr_item_sk 列を customer テーブルのプライマリキー列 customer_id に関連付けます。

CREATE TABLE store_returns (
  sr_sale_id BIGINT NOT NULL PRIMARY KEY,
  sr_store_sk BIGINT,
  sr_item_sk BIGINT NOT NULL,
  FOREIGN KEY (sr_item_sk) REFERENCES customer (customer_id)
);

JSON 配列インデックスを指定する

テーブルを作成し、vj 列に idx_vj という名前の JSON 配列インデックスを作成します。

CREATE TABLE json(
  id INT,
  vj JSON,
  INDEX idx_vj(vj->'$[*]')
)
DISTRIBUTED BY HASH(id);

JSON 配列インデックスの作成および変更方法については、JSON インデックス トピックの「JSON 配列インデックスを作成する」セクションと、ALTER TABLE トピックの「JSON 配列インデックス」セクションをご参照ください。

よくある質問

列属性と制約

自動インクリメント列は常に 1 から始まりますか? すべての値は一意ですか?

自動インクリメント列の値は連続していない場合があり必ずしも 1 から始まるわけではありません。ただし、自動インクリメント列のすべての値は一意です。

分散キー、パーティションキー、およびライフサイクル

分散キーとパーティションキーの違いは何ですか?

分散キーはシャーディングで使用されます。分散キーのハッシュ値に基づいて、テーブル内のデータは異なるシャードに分散されます。パーティションキーはパーティション分割で使用されます。シャード内では、データはパーティションキーの値に基づいて異なるパーティションにさらに分散されます。次の図は、シャーディングとパーティション分割の仕組みを示しています。

image

テーブルを作成するときに分散キーを指定する必要がありますか?

  • パーティションテーブルを作成する場合、分散キーを指定する必要はありません。プライマリキーを指定したが分散キーを指定しなかった場合、AnalyticDB for MySQL は自動的にプライマリキーを分散キーとして使用します。プライマリキーも分散キーも指定しない場合、AnalyticDB for MySQL は自動的に __adb_auto_id__ 列をテーブルに追加し、その列を分散キーとプライマリキーとして使用します。

  • レプリケートされたテーブルを作成する場合、分散キーを指定する必要はありません。ただし、DISTRIBUTED BY BROADCAST 句を使用して、AnalyticDB for MySQL クラスタの各ストレージノードがデータの完全なコピーを格納するように指定する必要があります。

クラスタの仕様を変更した場合、シャードの数は影響を受けますか?

いいえ、シャードの数はクラスタ仕様の変更による影響を受けません。

テーブルのパーティション情報をクエリするにはどうすればよいですか?

次の文を実行して、テーブルのパーティション情報をクエリできます。

SELECT partition_id, --パーティションの名前。
 row_count, -- パーティション内の行の総数。
 local_data_size, -- パーティションのローカルデータストレージ。
 index_size, -- パーティションインデックスのサイズ。
 pk_size, -- パーティションのプライマリキーインデックスのサイズ。
 remote_data_size -- パーティションのリモートデータストレージ。
FROM information_schema.kepler_partitions
WHERE schema_name = '$DB'
 AND table_name ='$TABLE' 
 AND partition_id > 0;

パーティションテーブルを作成した後、パーティション情報が表示されないのはなぜですか?

パーティションテーブルを作成した後、次の理由によりパーティション情報が表示されません。

  • テーブルにデータが書き込まれていません。テーブルを作成するときは、パーティションキーを指定することでパーティション分割ルールを設定するだけです。パーティション分割は、パーティションキーの値に基づいて実行されます。テーブルにデータが書き込まれていない場合、パーティションキーの値は空であり、パーティションは作成されません。

  • パーティションの BUILD ジョブが完了していません。パーティションはリアルタイムでは作成されません。テーブルの BUILD ジョブが完了した後でのみ、パーティション情報を表示できます。

解決策:

テーブルにデータを書き込み、BUILD ジョブが完了するまで待ちます。その後、パーティション情報を表示できます。

特定のパーティションのデータをクエリするにはどうすればよいですか?

WHERE <パーティションキー名> = '<パーティションキー値>' 句を使用して、特定のパーティションのデータをクエリできます。次の構文はサポートされていません: SELECT * FROM テーブル PARTITION(202304).

例:

order_date 列でパーティション分割された orders_demo という名前のテーブルを作成します。

CREATE TABLE orders_demo (
  order_id BIGINT NOT NULL COMMENT '注文 ID',
  customer_id INT NOT NULL COMMENT '顧客 ID',
  order_status VARCHAR(1) NOT NULL COMMENT '注文ステータス',
  total_price DECIMAL (15, 2) NOT NULL COMMENT '合計金額',
  order_date DATE NOT NULL COMMENT '注文日',
  PRIMARY KEY(order_id,order_date)
)
DISTRIBUTED BY HASH(order_id) 
PARTITION BY VALUE(date_format(order_date, '%Y%m')) LIFECYCLE 30 ;

テーブルに 10 行のデータを挿入します。

INSERT INTO orders_demo (order_id, customer_id, order_status, total_price, order_date)
VALUES
  (1001, 1, 'C', 150.75, '2023-10-01'),
  (1002, 2, 'P', 200.50, '2023-10-01'),
  (1003, 3, 'S', 99.99, '2023-10-01'),
  (1004, 4, 'C', 300.00, '2023-10-01'),
  (1005, 5, 'P', 450.25, '2023-10-02'),
  (1006, 6, 'S', 120.00, '2023-10-02'),
  (1007, 7, 'C', 80.50, '2023-10-03'),
  (1008, 8, 'P', 600.00, '2023-10-03'),
  (1009, 9, 'S', 250.75, '2023-10-03'),
  (1010, 10, 'C', 199.99, '2023-10-14');

BUILD 文を実行して、パーティションテーブルをビルドします。

BUILD TABLE orders_demo;
テーブルが特定の条件を満たしている場合、テーブルで BUILD ジョブが自動的にトリガーされます。この例では、後続の手順を容易にするために、テーブルを手動でビルドします。

BUILD ジョブのステータスをクエリします。 orders_demo テーブルの BUILD ジョブが完了している場合、status フィールドに FINISH の値が返されます。

SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK WHERE table_name='ORDERS_DEMO';

この例では、パーティションキー order_date は DATE 型です。 2023-10-01 パーティションのデータをクエリするには、次の文を実行します。

SELECT * FROM orders_demo WHERE order_date='2023-10-01';

パーティションキーが DATETIME 型の場合、WHERE 句を WHERE order_date >= "2023-10-01 00:00:00" and order_date < "2023-10-02 00:00:00" に設定します。サンプル文:

SELECT * FROM orders_demo WHERE order_date >= "2023-10-01 00:00:00" and order_date < "2023-10-02 00:00:00";

パーティションテーブルからデータをクエリするときに、パーティションキーをフィルター条件として指定する必要がありますか?

テーブルにパーティションキーがある場合、パーティションキーをフィルター条件として指定する必要はありません。ただし、パーティションキーをフィルター条件として指定すると、特定のパーティションのみがスキャンされるため、クエリのパフォーマンスを向上させることができます。

パーティションキーではどのようなデータ型がサポートされていますか?

パーティションキーは、数値型、日付時刻型、または数値を指定する文字列型にすることができます。他のデータ型では、データ書き込みエラーが発生する可能性があります。

次のエラーメッセージは、書き込まれたパーティションキー値がデータ型の要件を満たしていないことを示しています: partition format function error.

DATE_FORMAT() および FROM_UNIXTIME() 以外の関数を使用してパーティションキーを指定できますか?

いいえ、他の関数を使用してパーティションキーを指定することはできません。 PARTITION BY VALUE(列名)、PARTITION BY VALUE(date_format(列名, '形式'))、および PARTITION BY VALUE(FROM_UNIXTIME(列,'形式')) のいずれかの関数を使用してのみ、パーティションキーを指定できます。他の関数を使用すると、エラーが発生します。

説明

パーティションキーの詳細については、このトピックの「partition_options (パーティションキーとライフサイクル)」セクションを参照してください。

パーティションのライフサイクルをクエリするにはどうすればよいですか?

SHOW CREATE TABLE <テーブル名> 文を実行して、パーティションのライフサイクルを表示できます。パーティションのライフサイクルは、返された結果に表示されます。

LIFECYCLE の値を 30 に設定してデータを 30 日間だけ保持するように設定した後も、30 日以上保存されているデータをクエリできるのはなぜですか?

次の理由により、30 日以上保存されているデータをクエリできます。

  • 特定のパーティションの期限が切れたばかりで、まだ削除されていません。期限切れのパーティションは、テーブルの BUILD ジョブが完了するまで削除されません。

  • シャードレベルのパーティションライフサイクル管理を使用する V3.2.1.1 より前の AnalyticDB for MySQL クラスタの場合、テーブル内のシャードに含まれるパーティションの数が、LIFECYCLE n パラメーターで指定された数よりも少なくなります。この問題は、V3.2.1.1 以後の AnalyticDB for MySQL クラスタで作成されたテーブルでは発生しません。

    根本原因:

    • データが同じシャードに一貫して書き込まれていません。データが日付でパーティション分割されているとします。シャード 1 にはパーティション 20231201 から 20231230 が含まれ、シャード 2 にはパーティション 20231202 から 20231231 が含まれます。どちらのシャードにも 30 個のパーティションがあり、LIFECYCLE n パラメーターで指定された値 30 を超えていないため、両方のシャードのパーティションが保持されます。したがって、パーティション 20231201 から 20231231 のデータをクエリできます。

    • テーブルに新しいデータが長時間書き込まれていません。データが日付でパーティション分割されているとします。シャード 1 にはパーティション 20231201、20231202、20231203、および 20231204 が含まれます。新しいデータはパーティションに書き込まれません。この場合、シャード 1 には 4 つのパーティションしかなく、LIFECYCLE n パラメーターで指定された値 30 を超えていません。したがって、パーティションは削除されず、パーティション 20231201 のデータを引き続きクエリできます。

期限切れのパーティションのデータはすぐに削除されますか?

いいえ、パーティションはリアルタイムでは作成または削除されません。期限切れのパーティションは、テーブルの BUILD ジョブが完了するまで削除されません。

インデックス

テーブルのクラスタ化インデックスをクエリするにはどうすればよいですか?

SHOW CREATE TABLE 文を実行して、テーブルで指定されたクラスタ化インデックスをクエリできます。

AnalyticDB for MySQL は一意なインデックスをサポートしていますか?

いいえ、AnalyticDB for MySQL は一意なインデックスをサポートしていません。ただし、AnalyticDB for MySQL 内のテーブルのプライマリキーインデックスは一意なインデックスであり、プライマリキーの値が一意であることを保証します。

複数の列を使用して複合インデックスを作成できますか?INDEX(column1,column2) を使用して複数の列に複合インデックスを作成できますか?

いいえ、複数の列に複合インデックスを作成することはできません。通常のインデックスには単一の列のみを含めることができます。例: INDEX(column1).

列指向ストレージ

CREATE TABLE 文の TABLE_PROPERTIES='{"format":"columnstore"}' 構文はどういう意味ですか?

TABLE_PROPERTIES='{"format":"columnstore"}' は、ストレージエンジンが列指向ストレージを使用することを指定します。テーブルを作成するときに構文を変更する必要はありません。

テーブルを作成するときに、特定のパーティションに行指向ストレージを指定し、他のパーティションに列指向ストレージを指定できますか?

いいえ、テーブル内のパーティションに異なるストレージ形式を指定することはできません。

その他

テーブルを作成した後、ALTER TABLE 文を使用して何を変更できますか?

ALTER TABLE 文を実行して、次の変更を行うことができます。

  • 次のパラメーターを変更します: table_name、column_name、column_type、および COMMENT。

  • プライマリキー列以外の列を追加および削除します。

  • デフォルトの列値を変更します。

  • NOT NULL 列制約を NULL に変更します。

  • インデックスを作成および削除します。

  • パーティション関数のデータ形式を変更します。

  • パーティションのライフサイクルを変更します。

  • ストレージポリシーを変更します。

テーブルを作成した後は、他の変更を行うことはできません。詳細については、「ALTER TABLE」を参照してください。

クラスタごとにいくつのテーブルを作成できますか?

AnalyticDB for MySQL クラスタに作成できるテーブルの最大数には、次の制限が適用されます。

  • Enterprise Edition クラスタに作成できる内部テーブルの最大数: 80000/(シャード数/予約済みリソースノード数/3). この式では、シャード数/予約済みリソースノード数/3 の結果は切り上げる必要があります。作成できる内部テーブルの最大数を増やすには、予約済みリソースノードを追加 します。

  • Basic Edition クラスタに作成できる内部テーブルの最大数: 80000/(シャード数/予約済みリソースノード数). この式では、(シャード数/予約済みリソースノード数) の結果は切り上げる必要があります。作成できる内部テーブルの最大数を増やすには、予約済みリソースノードを追加 します。

  • Enterprise Edition、Basic Edition、および Data Lakehouse Edition クラスタまたは Data Warehouse Edition クラスタ (elastic モード) に作成できる外部テーブルの最大数: 500,000.

  • Data Lakehouse Edition クラスタに作成できる内部テーブルの最大数: [80000/(シャード数/予約済みストレージリソース量を 24 ACU で割った値)] × 2. 作成できる内部テーブルの最大数を増やすには、予約済みストレージリソースをスケールアップ します。

  • Data Warehouse Edition クラスタ (elastic モード) に作成できる内部テーブルの最大数: [80000/(シャード数/EIU 数)] × 2. この式では、[シャード数/EIU 数] の結果は切り上げる必要があります。作成できる内部テーブルの最大数を増やすには、elastic I/O ユニット (EIU) をスケールアウト します。

  • 1 ~ 20 個のノードグループを持つ Data Warehouse Edition クラスタ (reserved モード) に作成できる内部テーブルの最大数: 80000/(シャード数/ノードグループ数). この式では、[シャード数/ノードグループ数] の結果は切り上げる必要があります。作成できる内部テーブルの最大数を増やすには、ノードグループを追加 します。

説明

シャード の数をクエリするには、SELECT COUNT(1) FROM information_schema.kepler_meta_shards; 文を実行します。シャードの数を増減することはできません。

AnalyticDB for MySQL のデフォルトの文字セットは何ですか?AnalyticDB for MySQL

AnalyticDB for MySQL は、デフォルトの文字セットとして UTF-8 を使用します。これは、MySQL の utf8mb4 文字セットと同等です。他の文字セットはサポートされていません。

テーブルが内部テーブルか外部テーブルかを判断するにはどうすればよいですか?

SHOW CREATE TABLE db_name.table_name; 文を実行して、テーブルの DDL 文をクエリできます。 DDL 文に ENGINE パラメーターが含まれていない場合、または ENGINE パラメーターの値が XUANWU または XUANWU_V2 の場合、テーブルは内部テーブルです。それ以外の場合、テーブルは外部テーブルです。

一般的なエラーとトラブルシューティング

パーティション数は 0 より大きい必要があります

原因: パーティションキーは指定しましたが、パーティションのライフサイクルは指定していません。

ステートメントの例:

CREATE TABLE test (
  id INT COMMENT 'ID',
  name VARCHAR(10) COMMENT '名前',
  PRIMARY KEY (id, name)
) 
DISTRIBUTED BY HASH(id) PARTITION BY VALUE(name);

解決策: CREATE TABLE 文でパーティションのライフサイクルを指定します。ステートメントの例:

CREATE TABLE test (
  id INT COMMENT 'ID',
  name VARCHAR(10) COMMENT '名前',
  PRIMARY KEY (id, name)
) 
DISTRIBUTED BY HASH(id) PARTITION BY VALUE(name) LIFECYCLE 30;
説明

このエラーは、V3.2.1.0 より前の AnalyticDB for MySQL クラスターでのみ発生します。

許可されているパーティションは 204800 のみです。既存のパーティションの数=>196462

原因: クラスター内のパーティション数が、AnalyticDB for MySQL の上限である 102,400 を超えています。

クラスター内のパーティション数を照会するには、次のステートメントを実行します。

SELECT count(partition_id)
FROM information_schema.kepler_partitions
WHERE partition_id > 0;

解決策: ALTER TABLE 文を実行して、パーティションの粒度を上げます(日単位から月単位など)。

パーティション列 'XXX' がプライマリインデックス=> [YYY] に見つかりません

原因: テーブルのプライマリキーにパーティションキーが含まれていません。

ステートメントの例:

CREATE TABLE test (
  id INT COMMENT 'ID',
  name VARCHAR(10) COMMENT '名前',
  PRIMARY KEY (id)
) 
DISTRIBUTED BY HASH(id) PARTITION BY VALUE(name) LIFECYCLE 30;

このエラーは、プライマリキーまたは分散キーを指定しない場合にも発生します。テーブルの作成時にプライマリキーまたは分散キーを指定しない場合、AnalyticDB for MySQL は自動的に __adb_auto_id__ 列をテーブルに追加し、その列をプライマリキーおよび分散キーとして使用します。この場合、プライマリキーには __adb_auto_id__ 列のみが含まれ、パーティションキーは含まれません。そのため、このエラーが発生します。

ステートメントの例:

CREATE TABLE test (
  id INT COMMENT 'ID',
  name VARCHAR(10) COMMENT '名前'
) 
PARTITION BY VALUE(name) LIFECYCLE 30;

解決策: パーティションキーをプライマリキーに含めます。

SemanticException: 許可されているテーブルは 5000 のみです

原因: このエラーは、AnalyticDB for MySQL クラスター内のテーブルの総数が上限を超えた場合に発生します。テーブルの総数には、使用中のテーブルとテーブルのごみ箱に含まれるテーブルが含まれます。テーブル数の上限は、エディションと仕様によって異なります。詳細については、「制限」をご参照ください。

解決策:

  • 不要なテーブルを削除します。

    1. テーブルリストまたはテーブルのごみ箱に不要なテーブルが存在するかどうかを確認します。

    2. テーブルリストから不要なテーブルを削除するか、テーブルのごみ箱から削除します。

      重要

      テーブルリストから不要なテーブルを削除すると、そのテーブルはテーブルのごみ箱に表示されます。テーブルのごみ箱からもテーブルを削除する必要があります。

  • テーブルスキーマを最適化します。

    複数のテーブルを 1 つのテーブルにマージして、テーブル数を減らすことができます。

符号なし式はサポートされていません

原因: AnalyticDB for MySQL は、符号なし数値をサポートしていないため、UNSIGNED 属性をサポートしていません。

解決策: CREATE TABLE 文で列に UNSIGNED 属性を指定しないでください。代わりに、ビジネスコードで非負の値制約を実装する必要があります。

参照

  • データのテーブルへの書き込み方法については、「INSERT INTO」をご参照ください。

  • クエリ結果のテーブルへの挿入方法、またはクエリ結果によるテーブル内の特定のデータの上書き方法については、「INSERT SELECT FROM」または「INSERT OVERWRITE SELECT」をご参照ください。

  • ApsaraDB RDS、MaxCompute、OSS などのデータソースから AnalyticDB for MySQL にデータをインポートする方法については、「データインポート」をご参照ください。