AnalyticDB for MySQL allows you to execute the CREATE TABLE
statement to create a table or execute the CREATE TABLE AS SELECT (CTAS)
statement to write queried data to a new table.
Syntax
CREATE TABLE [IF NOT EXISTS] table_name
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'string']
| table_constraints}
[, ... ] )
table_attribute
[partition_options]
[storage_policy]
[block_size]
[engine]
[rt_engine]
[table_properties]
[AS] query_expression
COMMENT 'string'
column_attributes:
[DEFAULT default_expr]
[AUTO_INCREMENT]
column_constraints:
[{NOT NULL|NULL} ]
[PRIMARY KEY]
table_constraints:
[{INDEX|KEY} [index_name] (column_name,...)]
[PRIMARY KEY [index_name] (column_name,...)]
[CLUSTERED KEY [index_name] (column_name,...)]
table_attribute:
DISTRIBUTED BY HASH(column_name,...) | DISTRIBUTED BY BROADCAST
partition_options:
PARTITION BY
{VALUE(column_name) | VALUE(date_format(column_name, ?))}
LIFECYCLE N
storage_policy:
STORAGE_POLICY= 'HOT'|'COLD'|'MIXED' [hot_partition_count=N]
block_size:
BLOCK_SIZE= VALUE
engine:
ENGINE= 'XUANWU'
rt_engine:
RT_ENGINE= 'COLUMNSTORE'
table_properties:
TABLE_PROPERTIES = '{"format":"columnstore"}'
Parameters
Parameter | Description |
| The name of the table. The table name must be 1 to 127 characters in length and can contain letters, digits, and underscores (_). The table name must start with a letter or underscore (_). Specify the table name in the |
| The name of the column to be added to the table. The column name must be 1 to 127 characters in length and can contain letters, digits, and underscores (_). The column name must start with a letter or underscore (_). |
| The data type of the column to be added. For more information about the data types supported by AnalyticDB for MySQL, see Basic data types. |
|
|
|
|
| Note Unique indexes cannot be created in AnalyticDB for MySQL.
|
|
|
|
You can execute the following statement to query the partition information of a table:
For example, Note The number of nodes in an AnalyticDB for MySQL cluster varies with the following editions and modes:
AnalyticDB for MySQL does not allow you to change partition keys. If you want to use a different partition key for your table, perform the operations that are described in the "Change a partition or distribution key" section of the ALTER TABLE topic. Note
|
storage_policy | Note Tiered storage of hot and cold data is supported only for clusters in elastic mode for Cluster Edition.
Different storage policies bring about different data read and write performance and storage costs. To reduce data storage costs and ensure query performance, you can store the data that is frequently queried (called hot data) on SSDs and the data that is less frequently queried (called cold data) on Object Storage Service (OSS). You can also separately select cold and hot storage media based on table granularity and partition granularity. For example, you can specify that all data of the table is stored on SSDs, all data is stored on OSS, or data of part of partitions in the table is stored on SSDs and data of the rest partitions is stored on OSS.
|
hot_partition_count=N | The number of partitions that are stored on SSDs when the MIXED storage policy is used. These partitions are called hot partitions. Partitions are sorted by partition key value in descending order. The first N partitions are hot partitions and the others are cold partitions.
|
block_size | Specifies the number of values stored in each block in column-oriented storage. It is the minimum unit for I/O operations.
This parameter determines the size of values read or written in each I/O operation and affects query performance based on query characteristics. For example, if block_size is set to a large value for point queries, blocks are read inefficiently by the storage system. In this case, you can appropriately decrease the value of block_size. Important If you are not familiar with column-oriented storage, we recommend that you do not change the value of block_size. |
engine | The storage engine type of AnalyticDB for MySQL internal tables. Set the value to For more information, see Xuanwu analytical storage engine. |
rt_engine | The storage model of the real-time storage engine. Set the value to COLUMNSTORE. In this case, the RT_ENGINE information is not returned for |
table_properties | The storage model of AnalyticDB for MySQL internal tables for full data. Set the value to |
Usage notes
AnalyticDB for MySQL clusters use the UTF-8 encoding format during table creation. This encoding format is equivalent to the utf8mb4 format in MySQL. AnalyticDB for MySQL does not support other encoding formats.
AnalyticDB for MySQL does not support unsigned constraints.
The maximum number of tables that can be created in a cluster varies with the following AnalyticDB for MySQL modes:
Reserved mode:
80000/(Number of shards/Number of node groups)
. Each reserved mode cluster may have 1 to 20 node groups.Internal tables in elastic mode:
[80000/(Number of shards/Number of EIUs)] × 2
External tables in elastic mode: 500,000
Note- The following SQL statement can be used to query the number of shards:
SELECT count(1) FROM information_schema.kepler_meta_shards;
In the preceding formulas, the results of
Number of shards/Number of node groups
andNumber of shards/Number of EIUs
are rounded up to the nearest integer.- This value can be increased by adding more node groups. For more information, see Scale up or down a Data Warehouse Edition cluster and change the cluster mode.
- This value can be increased by adding more EIUs. For more information, see Use EIUs to scale up storage resources.
Examples
Create a standard table named test. Set
id
as an auto-increment column. Set the distribution key toid
. Configure the table data to be distributed based on the hash value of theid
column.CREATE TABLE test ( id bigint auto_increment, name varchar, value int, ts timestamp ) DISTRIBUTED BY HASH(id);
Create a standard table named customer. Set the distribution key to
customer_id
and the partition key tologin_time
. Configure the table data to be sorted bylogin_time
and retained for 30 days. Set the composite primary key tologin_time
,customer_id
, andphone_num
.CREATE TABLE customer ( customer_id bigint NOT NULL COMMENT 'Customer ID', customer_name varchar NOT NULL COMMENT 'Customer name', phone_num bigint NOT NULL COMMENT 'Phone number', city_name varchar NOT NULL COMMENT 'City', sex int NOT NULL COMMENT 'Gender', id_number varchar NOT NULL COMMENT 'ID card number', home_address varchar NOT NULL COMMENT 'Home address', office_address varchar NOT NULL COMMENT 'Office address', age int NOT NULL COMMENT 'Age', login_time timestamp NOT NULL COMMENT 'Logon time', 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 'Customer information table';
MySQL syntax compatibility
The standard CREATE TABLE syntax of AnalyticDB for MySQL must contain the DISTRIBUTED BY ...
clause. The standard CREATE TABLE syntax of MySQL does not contain the DISTRIBUTED BY ...
clause. By default, AnalyticDB for MySQL is compatible with the CREATE TABLE syntax of MySQL. You can use one of the following methods to resolve the compatibility issues caused by the DISTRIBUTED BY ...
clause:
By default, if a MySQL table contains a primary key, AnalyticDB for MySQL uses the primary key as the COLUMN value of the
DISTRIBUTED BY COLUMN
clause.CREATE TABLE t (c1 bigint, c2 int, c3 varchar, PRIMARY KEY(c1,c2));
SHOW CREATE TABLE t;
+-------+---------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------+ | t | Create Table `t` ( `c1` bigint, `c2` int, `c3` varchar, primary key (c1,c2) ) DISTRIBUTED BY HASH(`c1`,`c2`) INDEX_ALL='Y' | +-------+----------------------------------------------------------------------------+ 1 row in set (0.04 sec)
If a MySQL table does not contain a primary key, AnalyticDB for MySQL adds the
__adb_auto_id__
column as the primary key and uses it as the COLUMN value of theDISTRIBUTED BY COLUMN
clause.CREATE TABLE t (c1 bigint, c2 int, c3 varchar);
SHOW CREATE TABLE t;
+-------+----------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------+ | t | Create Table `t` ( `c1` bigint, `c2` int, `c3` varchar, `__adb_auto_id__` bigint AUTO_INCREMENT, primary key (__adb_auto_id__) ) DISTRIBUTED BY HASH(`__adb_auto_id__`) INDEX_ALL='Y' | +-------+----------------------------------------------------------------------------------------------+ 1 row in set (0.04 sec)
Specify a storage policy of hot and cold data when you create a table
Tiered storage of hot and cold data is supported only for clusters in elastic mode for Cluster Edition.
Syntax
CREATE TABLE [IF NOT EXISTS] table_name
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'string']
| table_constraints}
[, ... ] )
table_attribute
[partition_options]
[storage_policy]
[AS] query_expression
COMMENT 'string'
storage_policy:
STORAGE_POLICY= 'HOT'|'COLD'|'MIXED' [hot_partition_count=N]
Examples
Specify the COLD storage policy when you create a table
CREATE TABLE test_table ( L_ORDERKEY bigint NOT NULL, L_LINENUMBER int NOT NULL, L_SHIPDATE date NOT NULL, dummy varchar, primary key (l_orderkey,l_linenumber,l_shipdate) ) DISTRIBUTE BY HASH(l_orderkey) PARTITION BY VALUE(date_format(l_shipdate, '%Y%m')) LIFECYCLE 200 INDEX_ALL='Y' STORAGE_POLICY='COLD';
Specify the HOT storage policy when you create a table
CREATE TABLE test_table ( L_ORDERKEY bigint NOT NULL, L_LINENUMBER int NOT NULL, L_SHIPDATE date NOT NULL, dummy varchar, primary key (l_orderkey,l_linenumber,l_shipdate) ) DISTRIBUTE BY HASH(l_orderkey) PARTITION BY VALUE(date_format(l_shipdate, '%Y%m')) LIFECYCLE 200 INDEX_ALL='Y' STORAGE_POLICY='HOT';
Specify the MIXED storage policy and set the number of hot partitions to 16 when you create a table
CREATE TABLE test_table ( L_ORDERKEY bigint NOT NULL, L_LINENUMBER int NOT NULL, L_SHIPDATE date NOT NULL, dummy varchar, primary key (l_orderkey,l_linenumber,l_shipdate) ) DISTRIBUTE BY HASH(l_orderkey) PARTITION BY VALUE(date_format(l_shipdate, '%Y%m')) LIFECYCLE 200 INDEX_ALL='Y' STORAGE_POLICY='MIXED' HOT_PARTITION_COUNT=16;
Create a table that has a vector index
For more information about the syntax, parameters, and examples, see the "Create a vector index" section of the Vector search topic.