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语句类型 | 字句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
DELETE | PARTITION | 支持 | ||
-- | ORDER BY DESC | ASCLIMIT | 支持 | |
-- | 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 | 支持 | ||
INSERT | IGNORE | 支持 | ||
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语句类型 | 字句类型 | 功能 | 支持状态 | 说明 |
---|---|---|---|---|
INSERT | INSERT … SELECT … | 跨库简单单表查询 | 支持 | |
INSERT | INSERT … SELECT … | 跨库JOIN | 不支持 | |
INSERT | INSERT … SELECT … | 跨库UNION | 不支持 | |
INSERT | NSERT BATCH | 子表 | 支持 | 父表的JOIN字段不是分片字段时不支持。 |
INSERT | NSERT BATCH | 全局表 | 支持 | |
INSERT | NSERT BATCH | 分片表 | 支持 |
未完待续......
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论