计算节点特色功能
SQL流控
计算节点支持对高并发SQL语句进行自动的流量控制功能,可以自动识别高消耗SQL且限制同一时间内高消耗SQL执行的并发数和效率,从而稳定数据库服务。也提供查询入口使用户尽可能多的识别高消耗SQL语句并优化SQL以提升数据库整体服务性能。
当正在执行的SQL缓存行数超过设置的“触发高内存消耗SQL流控的缓存行数”阈值时,即触发流控;此时计算节点会捕获被流控的SQL并自动进行摘要处理,处理后生成对应的流控规则。
此外也可提前设置某类SQL的流控规则。计算节点通过SQL摘要(SQL指纹)来确定应该被流控的SQL查询,当来自多个并发请求的SQL查询与已设置流控规则的SQL摘要匹配,并且其并发数超过设定的阈值时,即触发流控。
流控管理命令
流控管理命令用于在计算节点层面操作SQL流控功能,包括开启、解除和删除流控规则。以下命令中,既可以填写完整SQL,也可填写SQL摘要;若填写完整SQL执行该命令,计算节点会自动进行摘要处理后保存该规则。
1.开启临时流控
SET FLOWCONTROL=HOLD."SQL语句";
该命令用于临时开启某类SQL的流控规则。此命令为暂时性,不会同步计算节点配置库,因此在重启计算节点后规则失效。
示例:
填写完整SQL
mysql> set flowcontrol=hold.'select 1';
Query OK, 0 rows affected (0.01 sec)
填写SQL摘要
mysql> set flowcontrol=hold."select 's'";
Query OK, 0 rows affected (0.01 sec)
2.开启永久流控
SET FLOWCONTROL=HOLD_PERSIST."SQL语句";
3.暂时解除流控
SET FLOWCONTROL=UNHOLD."SQL语句";
该命令用于暂时解除对某类SQL的流控规则。此命令为暂时性,因此不会从计算节点配置库删除规则,重启计算节点后规则会继续生效。
4.解除流控并保存规则
SET FLOWCONTROL=UNHOLD_PERSIST."SQL语句";
5.永久删除规则
SET FLOWCONTROL=DELETE_PERSIST."SQL语句";
该命令用于用永久删除某类SQL的流控规则,此规则会从配置库中同步删除。
注意
若在3323服务端口执行以上命令,则需要拥有super权限。
若执行开启命令时已存在同类SQL的流控规则,则会覆盖当前规则,保留最新一次的执行。
例如: 首次执行set flowcontrol=hold."select 1";开启一个临时规则。 第二次执行set
flowcontrol=hold_persist."select 's'";开启一个永久规则。
两条规则属于同一类SQL摘要,则保留最新一次执行,将该类SQL摘要的流控规则转变为永久规则。
流控规则查询
用户可以在3325管理端口执行show @@flowcontrol命令查看当前的流控规则及其状态。
示例:
mysql> show @@flowcontrol;
+------------+-----------------+---------------------------------+
| crc32 | status | digested |
+------------+-----------------+---------------------------------+
| 2690567015 | NO_FLOW_CONTROL | SELECT 'S' |
| 2697334227 | IN_CONTROL | SELECT 'S' FROM test_table |
+------------+-----------------+---------------------------------+
2 rows in set (0.02 sec)
该语句展示当下所有的临时与永久流控规则的状态,IN_CONTROL表示当下该规则正在启用,NO_FLOW_CONTROL表示当下该规则停用;
若执行解除或删除命令,无论该命令的性质是临时或者永久,该流控状态均变为NO_FLOW_CONTROL被保留在查询结果集中。每次重启计算节点后,该查询命令的结果集会刷新,仅展示当前正在启用与停用的永久流控规则,不展示已被永久删除的规则及所有临时规则。
分片表全局索引
新增分片表全局索引功能,在分片表的普通索引上创建全局索引,能有效提升分片表在使用普通索引时的查询效率,建表时可以指定全局索引,修改表结构时可以添加和删除全局索引。
创建分片表全局索引
1.CREATE TABLE语法
create table xxx (
id int,
a varchar(20),
b varchar(20),
c varchar(20),
d varchar(20),
primary key pk(id),
unique key uk(a),
key idx1(b,c),
key idx2(d),
global {key|index} gidx1(b,c),
global {key|index} gidx2(d)
);
2.CREATE GLOBAL INDEX语法
create global index index_name on tbl_name (key_part,...);
3.ALTER TABLE语法
alter table table_name add global {index | key} index_name(key_part,...);
4.管理端口global_key @@create语法
global_key @@create logicdb.table gidx1(column_name);
编辑分片表全局索引
1.删除分片表全局索引
ALTER TABLE table_name DROP GLOBAL {INDEX | KEY} index_name;
DROP GLOBAL INDEX global_idx_index_name ON table_name;
2.重命名分片表全局索引
ALTER TABLE table_name RENAME GLOBAL {INDEX | KEY} old_index_name TO new_index_name;
查看分片表全局索引
1.执行show create table会将分片表全局索引以注释的形式展示出来;
2.管理端口执行show @@global_key可查看指定库表或所有表的分片表全局索引状态;
show @@global_key [logicdb.table,logicdb.*];
注意事项
1.需开启隐藏参数:
2.创建的全局索引必须存在普通索引;
3.使用分片表全局索引时,SQL语句需满足 where global_key_column = 'xxx';
4.通过explain查看SQL执行效率,当出现type为ROUTE_BY_GLOBAL_INDEX时表示已使用分片表全局索引;
5.在高并发、数据重复度不高的情况下,相较于普通索引,使用分片表全局索引能有效提升查询性能。
数据类型与字符集
计算节点对数据类型的支持
数值类型
存储节点数据类型 | 支持状态 | 说明 |
---|---|---|
BIT | 限制支持 | DDL语句中可支持BIT类型,不支持在跨库的DML语句中对BIT类型的操作。 |
TINYINT | 支持 | |
SMALLINT | 支持 | |
MEDIUMINT | 支持 | |
INT | 支持 | |
INTEGER | 支持 | |
BIGINT | 支持 | |
SERIAL | 支持 | 与BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 同义 |
SERIAL DEFAULT VALUE | 支持 | 与NOT NULL AUTO_INCREMENT UNIQUE同义 |
REAL | 不支持 | 禁止设置为分片字段与父子表关联字段类型 |
DOUBLE | 不支持 | 禁止设置为分片字段与父子表关联字段类型 |
FLOAT | 不支持 | 禁止设置为分片字段与父子表关联字段类型 |
DECIMAL | 支持 | |
NUMERIC | 支持 |
日期与时间类型
存储节点数据类型 | 支持状态 | 说明 |
---|---|---|
DATE | 支持 | |
TIME | 支持 | |
TIMESTAMP | 支持 | |
DATETIME | 支持 | |
YEAR | 支持 |
字符串类型
存储节点数据类型 | 支持状态 | 说明 |
---|---|---|
CHAR | 支持 | |
VARCHAR | 支持 | |
BINARY | 支持 | |
VARBINARY | 支持 | |
TINYBLOB | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
BLOB | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
MEDIUMBLOB | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
LONGBLOB | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
TINYTEXT | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
TEXT | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
MEDIUMTEXT | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
LONGTEXT | 支持 | 禁止设置为分片字段与父子表关联字段类型 |
ENUM | 支持 | |
SET | 支持 |
空间类型
计算节点支持在创建表时,使用空间类型spatial_type;支持在单库的SQL语句中使用spatial_type;不支持在跨库的SQL语句中,对spatial_type的二次计算。
其他类型
存储节点数据类型 | 支持状态 | 说明 |
---|---|---|
JSON | 支持 | 禁止使用其作为分片字段、父子表关联字段,禁止使用其作为JOIN字段 |
计算节点对字符集的支持
计算节点支持字符集相关设置,目前可支持的字符集及校对集如下:
Collation | Charset |
---|---|
big5_chinese_ci | big5 |
big5_bin | big5 |
atin1_swedish_ci | latin1 |
latin1_bin | latin1 |
ascii_general_ci | ascii |
ascii_bin | ascii |
gb2312_chinese_ci | gb2312 |
gb2312_bin | gb2312 |
gbk_chinese_ci | gbk |
gbk_bin | gbk |
utf8_general_ci | utf8 |
utf8_bin | utf8 |
utf8mb4_general_ci | utf8mb4 |
utf8mb4_bin | utf8mb4 |
binary | binary |
gb18030_chinese_ci | gb18030 |
gb18030_bin | gb18030 |
与字符集相关的语法如下,计算节点也可同步支持,功能同MySQL一致:
功能分类 | 语法相关 |
---|---|
CREATE DATABASE | CREATE DATABASE db_name [DEFAULT] |
ALTER DATABASE | ALTER DATABASE db_name [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name |
CREATE TABLE | `col_name {CHAR | VARCHAR |
ALTER TABLE | ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]; |
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name [COLLATE collation_name]; | |
ALTER TABLE tbl_name MODIFY col_name column_definition CHARACTER SET charset_name [COLLATE collation_name]; | |
SET | SET NAMES 'charset_name' [COLLATE 'collation_name'] |
SET CHARACTER SET charset_name | |
`set [session] {character_set_client | character_set_results | |
WITH | With ORDER BY: SELECT k FROM t1 ORDER BY k COLLATE latin1_swedish_ci; |
With AS: SELECT k COLLATE latin1_swedish_ci AS k1 FROM t1 ORDER BY k1; | |
With GROUP BY: SELECT k FROM t1 GROUP BY k COLLATE latin1_swedish_ci; | |
With aggregate functions: SELECT MAX(k COLLATE latin1_swedish_ci) FROM t1; | |
With DISTINCT: SELECT DISTINCT k COLLATE latin1_swedish_ci FROM t1; | |
With WHERE: SELECT * FROM k WHERE a='a' COLLATE utf8_bin; | |
With HAVING: SELECT * FROM k WHERE a='a' having a='a' COLLATE utf8_bin order by id; |
特殊情况说明:
已有历史数据,且历史数据中其分片字段为非数值或者纯字母类型的数据,修改其表或分片字段的字符集,可能导致数据查询结果错误的情况。主要由于原路由算法中没有兼容这类情况,例如需要对字符串类型的存入数据做先转小写再转字符集utf8mb4存储的逻辑会遇到这类问题。故我们针对字符集转换功能做了相关优化处理。
执行如下修改字符集语句对分片字段所包含的内容进行字符集变更时,会进行进行校验:
ALTER TABLE tablename CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
ALTER TABLE 表名 CHANGE 分片字段列名 分片字段列名 ... [DEFAULT] CHARACTER SET [=] charset_name COLLATE collation_name]
1.若修改的字符集同已有表、已有分片字段的字符集一致,则允许修改;
2.若修改字符集同已有表、已有分片字段的字符集不一致,则校验:
(1). 被修改的目标表其分片字段是否为数值类型,若是数值类型,则目标新字符集可以修改为其他类型的字符集;
(2). 原有字符集是否为latin1 , 若是latin1则目标新字符集可以直接修改为其他类型的字符集;
(3). 原有字符集是否为utf8,若是utf8则校验目标新字符集是否为utf8mb4, 若是则可以直接修改,若不是则继续进行下一条校验:
(4). 原有字符集是否为utf8mb4,若是utf8mb4则校验目标新字符集是否为utf8,若是,则判断:select 1 from tablexx where length(shard_key)/char_length(shard_key)>3 limit 1; 是否有数据返回,若没有数据返回则可以进行字符集修改,若有数据返回,则给到第(5)条一样的ERROR提示进行拦截;
(5). 若以上场景均不包含,则继续验证其分片字段已有数据的length属性 和char_length属性是否相等,若相等则可以进行字符集修改,若不相等,则给到ERROR拦截提示:
“当前字符集转换可能导致路由错误,推荐使用分片方案在线变更功能修改数值类型的字段作为分片字段后,再进行字符集转换操作”。
The current conversion operation of character sets may cause routing errors.It is recommended to modify the numerical fields as sharding key through the Sharding Plan Online Modification function before the modification of character sets.
3.若仅对非分片字段进行字符集变更,则可以执行。主要对涉及到分片字段变更的范围进行校验控制并拦截;
4.如下这类语句字符集只会对表的默认字符集产生影响,不会影响已有数据的字符集,故可以执行修改语句;
ALTER TABLE tablename [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
5.历史版本(20210308之前的版本)建议用户遇到该类情况需自行查看历史数据的详情内容(必须是纯数字、纯字母类型)以判断是否可以直接进行字符集变更,若分片字段不是纯数字、纯字母类型,则需要进行分片方案变更,选择纯数字、纯字母类型字段作为新的分片字段,之后再进行字符集的变更。