在 SQL 语法上, RadonDB 与 MySQL 完全兼容。
在满足大部分需求场景下, RadonDB 的 SQL 实现只是 MySQL 一个子集,从而更好的使用和规范。
RadonDB 对 Database 的操作只支持创建和删除。
语法:
CREATE DATABASE [IF NOT EXISTS] db_name
说明:
- RadonDB 会把此语句直接发到所有后端执行并返回。
- 跨分区非原子操作。
示例:
mysql> CREATE DATABASE sbtest1;
Query OK, 4 rows affected (0.01 sec)
语法:
DROP DATABASE [IF EXISTS] db_name
说明:
- RadonDB 会把此语句直接发到所有后端并返回。
- 跨分区非原子操作。
示例:
mysql> DROP DATABASE sbtest1;
Query OK, 0 rows affected (0.02 sec)
语法:
CREATE TABLE [IF NOT EXISTS] table_name
(create_definition,...)
[ENGINE={InnoDB|TokuDB}]
[DEFAULT CHARSET=(charset)]
PARTITION BY HASH(shard-key)
说明:
- 创建分区信息并在各个分区生成分区表。
- 分区表语法必须包含
PARTITION BY HASH (分区键)
。 - 分区键仅支持指定一个列, 该列数据类型没有限制 (BINARY/NULL 类型除外)。
- 分区方式为 HASH, 根据分区键 HASH 值均匀分散在各个分区。
- table_options 只支持 ENGINE 和 CHARSET,其他自动被忽略。
- 分区表默认引擎为 InnoDB。
- 表字符集默认为 utf8。
- 不支持非分区键的 PRIMARY/UNIQUE 约束,直接返回错误。
- 跨分区非原子操作。
示例:
mysql> CREATE TABLE t1(id int, age int) PARTITION BY HASH(id);
Query OK, 0 rows affected (0.09 sec)
语法:
DROP TABLE [IF EXISTS] table_name
说明:
- 删除分区信息及后端分区表。
- 跨分区非原子操作。
示例:
mysql> DROP TABLE t1;
Query OK, 0 rows affected (0.05 sec)
ALTER TABLE... ENGINE...
用来做表引擎更换。
语法:
ALTER TABLE ... ENGINE={InnoDB|TokuDB...}
说明:
- RadonDB 根据路由信息,发到相应的后端执行引擎更改。
- 跨分区非原子操作。
示例:
mysql> SHOW CREATE TABLE t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> ALTER TABLE t1 ENGINE=TokuDB;
Query OK, 0 rows affected (0.15 sec)
mysql> SHOW CREATE TABLE t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=TokuDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
RadonDB 的表字符集默认为 utf8,下例语法用来修改表字符集。
语法:
ALTER TABLE table_name CONVERT TO CHARACTER SET {charset}
说明:
- RadonDB 根据路由信息,发到相应的后端执行表字符集修改。
- 跨分区非原子操作。
示例:
mysql> create table t1(id int, b int) partition by hash(id);
Query OK, 0 rows affected (0.15 sec)
mysql> show create table t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> alter table t1 convert to character set utf8mb4;
Query OK, 0 rows affected (0.07 sec)
mysql> show create table t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
语法:
TRUNCATE TABLE table_name
说明:
- 跨分区非原子操作。
示例:
mysql> insert into t1(a) values(1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------+
| a |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
mysql> truncate table t1;
Query OK, 0 rows affected (0.17 sec)
mysql> select * from t1;
Empty set (0.01 sec)
语法:
ALTER TABLE table_name ADD COLUMN (col_name column_definition,...)
说明:
- 为表增加新列。
- 跨分区非原子操作。
示例:
mysql> CREATE TABLE t1(a int primary key) PARTITION BY HASHa);
Query OK, 0 rows affected (0.16 sec)
mysql> ALTER TABLE t1 ADD COLUMN (b int, c varchar(100));
Query OK, 0 rows affected (0.10 sec)
mysql> SHOW CREATE TABLE t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
`c` varchar(100) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
语法:
ALTER TABLE table_name DROP COLUMN col_name
说明:
- 删除表的列。
- 无法删除分区键所在的列。
- 跨分区非原子操作。
示例:
mysql> ALTER TABLE t1 DROP COLUMN c;
Query OK, 0 rows affected (0.10 sec)
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
ERROR:
No query specified
mysql> ALTER TABLE t1 DROP COLUMN a;
ERROR 1105 (HY000): unsupported: cannot.drop.the.column.on.shard.key
语法:
ALTER TABLE table_name MODIFY COLUMN col_name column_definition
说明:
- 修改表的列定义。
- 无法修改分区键所在的列。
- 跨分区非原子操作。
示例:
mysql> ALTER TABLE t1 MODIFY COLUMN b bigint;
Query OK, 0 rows affected (0.31 sec)
mysql> SHOW CREATE TABLE t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` bigint(20) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> ALTER TABLE t1 MODIFY COLUMN a bigint;
ERROR 1105 (HY000): unsupported: cannot.modify.the.column.on.shard.key
为了简化索引操作, RadonDB 只支持 CREATE/DROP INDEX 语法。
语法:
CREATE INDEX index_name ON table_name (index_col_name,...)
说明:
- RadonDB 根据路由信息,发到相应的后端执行索引添加。
- 跨分区非原子操作。
示例:
mysql> CREATE INDEX idx_id_age ON t1(id, age);
Query OK, 0 rows affected (0.17 sec)
语法:
DROP INDEX index_name ON table_name
说明:
- RadonDB 根据路由信息,发到相应的后端执行索引删除。
- 跨分区非原子操作。
示例:
mysql> DROP INDEX idx_id_age ON t1;
Query OK, 0 rows affected (0.09 sec)
语法:
SELECT
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name}
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]]
说明:
- 支持跨分区的 count, sum, avg, max, min 等聚合函数, avg 字段必须在 select_expr 中, 聚合函数只对数值型有效。
- 支持跨分区的 order by, group by, limit 等操作, 字段必须在 select_expr 中。
- 支持 join 等复杂查询,自动路由到计算节点 (AP-Node) 执行并返回。
示例:
mysql> SELECT id, age, sum(id), avg(age) FROM t1 GROUP BY id ORDER BY id DESC LIMIT 10;
+------+------+---------+----------+
| id | age | sum(id) | avg(age) |
+------+------+---------+----------+
| 1 | 25 | 2 | 26 |
| 3 | 32 | 3 | 32 |
+------+------+---------+----------+
2 rows in set (0.01 sec)
语法:
INSERT INTO tbl_name
(col_name,...)
{VALUES | VALUE}
说明:
- 支持分布式事务,保证跨分区写入原子性。
- 支持 insert 多个值,这些值可以在不同分区。
- 必须指定写入列。
- 不支持子句。
示例:
mysql> INSERT INTO t1(id, age) VALUES(1, 24), (2, 28), (3, 29);
Query OK, 3 rows affected (0.01 sec)
语法:
DELETE FROM tbl_name
[WHERE where_condition]
说明:
- 支持分布式事务,保证跨分区删除原子性。
- 不支持无 WHERE 条件删除。
- 不支持子句。
示例:
mysql> DELETE FROM t1 WHERE id=1;
Query OK, 2 rows affected (0.01 sec)
语法:
UPDATE table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
说明:
- 支持分布式事务,保证跨分区更新原子性。
- 不支持无 WHERE 条件更新。
- 不支持更新分区键。
- 不支持子句。
示例:
mysql> UPDATE t1 set age=age+1 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
语法:
REPLACE INTO tbl_name
[(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
说明:
- 支持分布式事务,保证跨分区写入原子性。
- 支持 replace 多个值,这些值可以在不同分区。
- 必须指定写入列。
示例:
mysql> REPLACE INTO t1 (id, age) VALUES(3,34),(5, 55);
Query OK, 2 rows affected (0.01 sec)
语法:
SHOW ENGINES
说明:
- 后端分区 MySQL 支持的引擎列表。
示例:
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| TokuDB | YES | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology | YES | YES | YES |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
10 rows in set (0.00 sec)
语法:
SHOW DATABASES
说明:
- 包含系统 DB,比如 mysql, information_schema
示例:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sbtest |
| sbtest1 |
| sys |
| test |
+--------------------+
7 rows in set (0.00 sec)
语法:
SHOW TABLES
[FROM db_name]
说明:
- 如果未指定 db_name, 则返回当前 DB 下的表。
示例:
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| t1 |
| t2 |
| t3 |
| t4 |
| t5 |
+----------------+
5 rows in set (0.00 sec)
语法:
SHOW CREATE TABLE table_name
说明:
- N/A
示例:
mysql> SHOW CREATE TABLE t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
语法:
SHOW PROCESSLIST
说明:
- 显示的为 client 到 RadonDB 的连接情况,并非后端分区 MySQL。
示例:
mysql> SHOW PROCESSLIST;
+------+------+-------------------+------+---------+------+-------+------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+------+------+-------------------+------+---------+------+-------+------+-----------+---------------+
| 1 | mock | 192.168.0.3:35346 | test | Sleep | 379 | | | 0 | 0 |
+------+------+-------------------+------+---------+------+-------+------+-----------+---------------+
1 row in set (0.00 sec)
语法:
SHOW VARIABLES
[LIKE 'pattern' | WHERE expr]
说明:
- 为了兼容 JDBC/mydumper 。
- SHOW VARIABLES 命令会发往后端分区 MySQL (随机分区)获取并返回。
语法:
USE db_name
说明:
- 切换当前 session 的 database
示例:
mysql> use test;
Database changed
语法:
KILL processlist_id
说明:
- kill 某个链接(包含终止链接正在执行的语句)。
示例:
mysql> show processlist;
+------+------+-----------------+------+---------+------+-------+------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+------+------+-----------------+------+---------+------+-------+------+-----------+---------------+
| 11 | mock | 127.0.0.1:43028 | test | Sleep | 291 | | | 0 | 0 |
+------+------+-----------------+------+---------+------+-------+------+-----------+---------------+
1 row in set (0.00 sec)
mysql> kill 11;
ERROR 2013 (HY000): Lost connection to MySQL server during query
说明:
- 为了兼容 JDBC/mydumper 。
- SET 是一个空操作,所有操作并不会生效,请勿直接使用。