【IT168 技术】背景
在 SQL 语法上, RadonDB 与 MySQL 完全兼容。
在满足大部分需求场景下, RadonDB 的 SQL 实现只是 MySQL 一个子集,从而更好的使用和规范。
DDL
1. DATABASE
RadonDB 对 Database 的操作只支持创建和删除。
1.1. 创建 DB
语法:
CREATE DATABASE [IF NOT EXISTS] db_name
说明:
· RadonDB 会把此语句直接发到所有后端执行并返回。
· 跨分区非原子操作。
示例:
mysql> CREATE DATABASE sbtest1;
Query OK, 4 rows affected (0.01 sec)
1.2. 删除 DB
语法:
DROP DATABASE [IF EXISTS] db_name
说明:
· RadonDB 会把此语句直接发到所有后端并返回。
· 跨分区非原子操作。
示例:
mysql> DROP DATABASE sbtest1;
Query OK, 0 rows affected (0.02 sec)
2. TABLE
2.1. 创建表
语法:
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)
2.2. 删除表
语法:
DROP TABLE [IF EXISTS] table_name
说明:
· 删除分区信息及后端分区表。
· 跨分区非原子操作。
示例:
mysql> DROP TABLE t1;
Query OK, 0 rows affected (0.05 sec)
2.3. 更改表引擎
ALTER TABLE... ENGINE...用来做表引擎更换。
语法:
ALTER TABLE ... ENGINE={InnoDB|TokuDB...}
说明:
· RadonDB 根据路由信息,发到相应的后端执行引擎更改。
· 跨分区非原子操作。
示例:
2.4. 更改表字符集
RadonDB 的表字符集默认为 utf8,下例语法用来修改表字符集。
语法:
ALTER TABLE table_name CONVERT TO CHARACTER SET {charset}
说明:
· RadonDB 根据路由信息,发到相应的后端执行表字符集修改。
· 跨分区非原子操作。
示例:
2.5. 清空表
语法:
TRUNCATE TABLE table_name
说明:
· 跨分区非原子操作。
示例:
3. 列操作
3.1. 添加新列
语法:
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)
3.2. 删除列
语法:
ALTER TABLE table_name DROP COLUMN col_name
说明:
· 删除表的列。
· 无法删除分区键所在的列。
· 跨分区非原子操作。
示例:
3.3. 修改列
语法:
ALTER TABLE table_name MODIFY COLUMN col_name column_definition
说明:
· 修改表的列定义。
· 无法修改分区键所在的列。
· 跨分区非原子操作。
示例:
4. INDEX
为了简化索引操作, RadonDB 只支持 CREATE/DROP INDEX 语法。
4.1. 添加索引
语法:
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)
4.2. 删除索引
语法:
DROP INDEX index_name ON table_name
说明:
· RadonDB 根据路由信息,发到相应的后端执行索引删除。
· 跨分区非原子操作。
示例:
mysql> DROP INDEX idx_id_age ON t1;
Query OK, 0 rows affected (0.09 sec)
DML
1. SELECT 语句
语法:
SELECT
说明:
· 支持跨分区的 count, sum, avg, max, min 等聚合函数, avg 字段必须在 select_expr 中, 聚合函数只对数值型有效。
· 支持跨分区的 order by, group by, limit 等操作, 字段必须在 select_expr 中。
· 支持 join 等复杂查询,自动路由到计算节点 (AP-Node) 执行并返回。
示例:
2. INSERT 语句
语法:
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)
3. DELETE 语句
语法:
DELETE FROM tbl_name
[WHERE where_condition]
说明:
· 支持分布式事务,保证跨分区删除原子性。
· 不支持无 WHERE 条件删除。
· 不支持子句。
示例:
mysql> DELETE FROM t1 WHERE id=1;
Query OK, 2 rows affected (0.01 sec)
4. UPDATE 语句
语法:
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)
5. REPLACE 语句
语法:
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
1. SHOW ENGINES
语法:
SHOW ENGINES
说明:
· 后端分区 MySQL 支持的引擎列表。
示例:
2. SHOW DATABASES
语法:
SHOW DATABASES
说明:
· 包含系统 DB,比如 mysql, information_schema
示例:
3. SHOW TABLES
语法:
SHOW TABLES
[FROM db_name]
说明:
· 如果未指定 db_name, 则返回当前 DB 下的表。
示例:
4. SHOW CREATE TABLE
语法:
SHOW CREATE TABLE table_name
说明:
· N/A
示例:
5. SHOW PROCESSLIST
语法:
SHOW PROCESSLIST
说明:
· 显示的为 client 到 RadonDB 的连接情况,并非后端分区 MySQL。
示例:
6. SHOW VARIABLES
语法:
SHOW VARIABLES
[LIKE 'pattern' | WHERE expr]
说明:
· 为了兼容 JDBC/mydumper 。
· SHOW VARIABLES 命令会发往后端分区 MySQL (随机分区)获取并返回。
USE
1. USE DATABASE
语法:
USE db_name
说明:
· 切换当前 session 的 database
示例:
mysql> use test;
Database changed
KILL
1. KILL processlist_id
语法:
KILL processlist_id
说明:
· kill 某个链接(包含终止链接正在执行的语句)。
示例:
SET
说明:
· 为了兼容 JDBC/mydumper 。
· SET 是一个空操作,所有操作并不会生效,请勿直接使用。