使用限制

最近更新时间:2019-04-19 14:50:49

用户权限相关限制

目前版本不能通过命令行进行用户权限相关的设置,需要登录腾讯云管理中心进行网页操作。

    mysql> grant all on *.* to 'test'@'%' identified by 'test123';
    ERROR 7009 (HY000): Proxy ERROR:proxy do not support such use yet

暂不支持的一些特性

  1. 自定义数据类型、自定义函数。
  2. 视图、存储过程、触发器,游标。
  3. 外键,自建分区。
  4. 复合语句,如 BEGIN END、LOOP 等。
  5. 子查询目前只支持带 shardkey 的 derived table。

数据库状态信息限制

  1. 查询数据库状态信息的 sql,会随机发到某个物理分片,因此统计信息可能不准确。
  2. 查询系统表也是随机发到某个物理分片。

聚合函数限制

  1. 如果需要distinct后再做聚合,那么 where 条件必须带 shardkey。

    select count(distinct a),sum(distinct a),avg(distinct a) from table where sk=\*\*
  2. 对于distinctorder bygroup by若后面跟函数,该函数必须出现在select的字段中,而且必须定义别名,对应distinctorder bygroup by后使用别名。

    select concat(...) as substr from table where ... order by substr
  3. group by的字段必须在select的字段中,如下select中必须包含字段 b。

    select count(a),b from test group by b

JOIN 限制详述

当前 TDSQL 只支持单个 shard 内的 join 操作,单个 shard 意味着在一个事务内的所有 sql 必须操作同一个 shard,因此必须指定 shardkey 字段。

mysql> create table test1 ( a int , b int, c char(20) ) shardkey=a;
Query OK, 0 rows affected (1.56 sec)
mysql> create table test2 ( a int , d int, e char(20) ) shardkey=a;
Query OK, 0 rows affected (1.46 sec)
mysql> insert into test1 (a,b,c) values(1,2,"record1"),(2,3,"record2");
Query OK, 2 rows affected (0.02 sec)
mysql> insert into test2 (a,d,e) values(1,3,"test2_record1"),(2,3,"test2_record2");
Query OK, 2 rows affected (0.02 sec)
mysql> select * from test1 join test2 on test1.a=test2.a;
ERROR 1105 (07000): Proxy Warning - join shardkey error
mysql> select * from test1 join test2 on test1.a=test2.a where test1.a=1;
+------+------+---------+------+------+---------------+
| a     | b     | c        | a     | d     | e                |
+------+------+---------+------+------+---------------+
| 1     | 2     | record1 | 1    | 3      | test2_record1 |
+------+------+---------+------+------+---------------+
1 row in set (0.00 sec)

注意:

mysql> select * from test1 join test2 on test1.a=test2.a;语句在后续版本中会支持,但必须是 inner join 且 inner join 的 where 条件必须是两张表的 shardkey 字段相等。

预处理限制详述

sql 类型支持:

PREPARE Syntax
EXECUTE Syntax

二进制协议支持:

COM_STMT_PREPARE
COM_STMT_EXECUTE

代码示例如下:

    mysql> select * from test1;
    +---+------+
    | a | b    |
    +---+------+
    | 5 |    6 |
    | 3 |    4 |
    | 1 |    2 |
    +---+------+
    3 rows in set (0.03 sec)

    mysql> prepare ff from "select * from test1 where a=?";
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared

    mysql> set @aa=3;
    Query OK, 0 rows affected (0.00 sec)

    mysql> execute ff using @aa;
    +---+------+
    | a | b    |
    +---+------+
    | 3 |    4 |
    +---+------+
    1 row in set (0.06 sec)

SQL 限制详述

创建表不支持如下语法:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
SELECT * from old_tbl_name;

INSERT 不支持如下语法:

    INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
        [ ON DUPLICATE KEY UPDATE
          col_name=expr
            [, col_name=expr] ... ]

SELECT 不支持如下语法:

    SELECT
        [INTO OUTFILE 'file_name'
            [CHARACTER SET charset_name]
            export_options
          | INTO DUMPFILE 'file_name'
          | INTO var_name [, var_name]]

不支持 KILL。

SQL 支持类型详述

DDL 语法兼容,具体参考 DDL语句

    CREATE TABLE Syntax
    CREATE INDEX Syntax
    DROP TABLE Syntax
    DROP INDEX Syntax
    ALTER TABLE Syntax
    TRUNCATE TABLE Syntax

DML 语法兼容,具体参考 创建分表

    INSERT Syntax
    REPLACE Syntax
    UPDATE Syntax
    DELETE Syntax
    SELECT Syntax

Prepare 语法兼容:

    PREPARE Syntax
    EXECUTE Syntax
    DEALLOCATE PREPARE Syntax

Prepare 语法示例:

    mysql> prepare ff from 'select * from test.test1 where a=?';
    mysql> set @a=1;
    mysql> execute ff using @a;
    mysql> deallocate prepare ff;

数据库工具指令:

    DESCRIBE Syntax
    EXPLAIN Syntax
    USE Syntax

数据库管理语法兼容:

    SET Syntax,不支持修改全局变量
    SHOW Syntax
    SHOW COLUMNS Syntax
    SHOW CREATE TABLE Syntax
    SHOW INDEX
    SHOW TABLES Syntax
    SHOW TABLE STATUS Syntax
    SHOW TABLES Syntax
    SHOW VARIABLES Syntax

数据库管理语法示例:

    mysql> show columns from test.test1;
    mysql> show index from test.test1;
    mysql> show table status;    
    mysql> show tables from test;    
    mysql> show variables like "%char%";    

其他的 SHOW 指令 proxy 会随机发到某个物理分片(set)。