Amygoing
作者Amygoing联盟成员·2020-06-03 12:14
产品经理·数据库

分布式事务数据库HotDB的语法DML之INSERT/UPDATE/DELETE/REPLACE/LOAD DATA语句

字数 2917阅读 1172评论 0赞 0

1.SQL语法支持
DML语句
在分布式数据库中,DML语句的逻辑将变的更为复杂。计算节点将DML语句分为两大类:单库DML语句与跨库DML语句。

单库DML语句,指SQL语句只需在一个节点上运行,即可计算出正确结果。假设分片表customer分片字段为provinceid,则下列语句为单库SELECT,因为该条语句只会在provinceid=1所路由的那个节点上运行:

SELECT * FROM customer WHERE provinceid=1;

跨库DML语句,指SQL语句需要多个数据节点的数据,经过计算节点的二次处理,才能整合计算出最终的结果。假设分片表customer分片字段为provinceid,则下面的SELECT语句为跨库语句,因为 id>10的数据可能分布在多个节点,为了整合并排序得出最终结果,需要获取多个节点的数据:

SELECT * FROM customer WHERE id>10 ORDER BYid;

显然,单库的SQL语句要比跨库的SQL语句性能高。在使用计算节点的时候,尽量使用单库的DML语句。

上面的例子,描述的仅仅是简单单表的SELECT单库与跨库查询。那么在JOIN中,需要多个数据节点的数据时,称之为跨库JOIN;只需要单个数据节点的数据时,称之为单库JOIN。

对于子查询语句,需要查询多个数据节点的数据时,称之为跨库子查询;只需要单个数据节点的数据时,称之为单库子查询。

计算节点对单库JOIN的查询支持功能,与单库SELECT语句支持功能一样。计算节点对跨库JOIN语句的支持,请参考跨库JOIN

2.DELETE语句
MySQL5.6.2开始,DELETE语句支持删除指定分区(partition)中的数据。如有表名称t与分区名称p0,下面语句将删除分区p0所有的数据:

DELETE FROM t PARTITION(p0);

2.1 单库的DELETE语句

MySQL语句类型字句类型功能支持状态说明
DELETEPARTITION 支持
--ORDER BY DESCASCLIMIT支持
--LIMIT 支持
--ORDER BY … LIMIT … 支持
--ORDER BY字段值大小写敏感 父子表不支持
--WHERE函数支持
--多表DELETE 部分支持部分不支持的语法,例如,DELETE … LIMIT,使用NDB且满足NDB限制的支持。

在跨库的DELETE中语句,下面的多表语句不被支持:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROMtbl_name[.] [, tbl_name[.]] ...
USINGtable_references
[WHEREwhere_condition]

3.INSERT语句

3.1单库INSERT语句

MySQL语句类型字句类型功能支持状态说明
INSERT … SELECT …单库简单单表查询支持
INSERT … SELECT …单库JOIN支持
INSERT … SELECT …单库子查询支持
INSERT … SELECT …单库UNION/UNION ALL支持
INSERTIGNORE 支持
PARTITION 支持
ON DUPLICATE KEY UPDATE 支持
INSERT INTO table_name(columns… ) VALUES(values…) 支持
INSERT INTO … VALUES() 支持
INSERT INTO … SET 支持
分片表无拆分字段值 不支持
分片表拆分字段值为NULL 支持需要在分片函数参数中配置NULL值参数
子表无关联字段值 不支持子表数据的INSERT操作必须满足外键条件
子表关联字段值为NULL 不支持子表数据的INSERT操作必须满足外键条件
INSERT BATCH分片表支持 支持
INSERT BATCH全局表支持
INSERT BATCH子表条件限制父表的关联字段不是分片字段时不支持。

对于INSERT … SELECT …语句,限制如下:

Ø 不支持分片表向全局表insert,也不支持子表向全局表insert。在server.xml中添加隐藏参数aggressive=true后可支持,但添加此参数可能对性能有影响。

Ø 不支持select子句是需要合并结果集再处理的语句,例如聚合函数/distinct/order by/group by /having/limit/join/union等。

Ø 父子表不支持inser/replace into… select…。

· INSERT IGNORE

Ø 在计算节点上,INSERT IGNORE保留了MySQL原有的特性。当出现主键/唯一键冲突时,将忽略数据与冲突信息。

mysql> create table test(id int not nullprimary key,provinceid int)engine=innodb;

Query OK, 0 rows affected (0.02 sec)

mysql> insert into test set id =1,provinceid=2;

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+----+------------+
| id | provinceid |
+----+------------+
|   1  |      2        |
+-----------------+
1 row in set (0.00 sec)

mysql> insert ignore into test set id =1,provinceid=2; --主键id为1的记录已经存在,数据被忽略。

Query OK, 0 rows affected (0.00 sec)

对分片表INSERTIGORE语句的操作,若INSERT语句中,没有给出分片字段与分片字段值,计算节点将忽略该SQL语句:

3.2跨库的INSERT语句

在分布式事务数据库中,INSERT语句只有在INSERT … SELECT与INSERTBATCH两种情况下,才会产生跨库INSERT语句。
INSERT BATCH指的是单条INSERT语句,写入多行记录的方式:
INSERT INTO … table_nameVALUES(),VALUES(),VALUES();

MySQL语句类型字句类型功能支持状态说明
INSERTINSERT … SELECT …跨库简单单表查询支持
INSERTINSERT … SELECT …跨库JOIN不支持
INSERTINSERT … SELECT …跨库UNION不支持
INSERTNSERT BATCH子表支持父表的JOIN字段不是分片字段时不支持。
INSERTNSERT BATCH全局表支持
INSERTNSERT BATCH分片表支持

未完待续......

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广