【TcaplusDB 知识库】MySQLDriver使用入门

TcaplusDB 版本在 3.57.1 之后兼容 MySQL 5.7 协议,支持 MySQL 的基本功能和语法。MySQL 生态的客户端驱动、工具均适用于 TcaplusDB。


兼容 MySQL 协议是 TcaplusDB 的新特性,目前支持的 SQL 功能有限,包括以下 7 个要点:


  • 支持单表的 SELECT、INSERT、DELETE、UPDATE 语句;

  • SELECT、DELETE、UPDTATE 操作的 WHERE 子句中必须明确指定一个或多个主键,详见后文《SQL 语法使用参考》;

  • 在配置了全局索引的情况下,支持基础的聚合函数,详见后文《全局索引查询》;

  • 暂不支持 prepared statement;

  • 暂不支持 DDL,即 CREATE / DROP TABLE 等;

  • 不支持 ORDER BY、GROUP BY;

  • 不支持跨表 JOIN。

1. 客户端或驱动的版本兼容

TcaplusDB 兼容 MySQL 5.7 协议,使用支持 MySQL 5.7 协议(包括 5.7)的客户端或者驱动皆可进行连接。


在实际使用中,可能存在不同版本的兼容差异,我们推荐使用 MySQL 5.0 以上 5.7(包括 5.7)以下的客户端或者驱动。经过我们测试,下述版本的客户端或驱动均可正常使用:


2. 表定义和建表

2.1 表定义

TcaplusDB 当前不支持通过 SQL 的方式动态建表,为了能够顺利进行示例体验,可以使用 XML 文件(如下面示例)进行表定义,通过 Tcaplus OMS 平台进行建表。


表定义示例:

<?xml version="1.0" encoding="GBK" standalone="yes" ?>
<metalib name="demo_table" tagsetversion="1" version="1">
    <struct name="user" version="1" primarykey="user_id,server_id" splittablekey="user_id">
        <entry name="user_id" type="string" size="450" desc="用户ID"/>
        <entry name="server_id" type="int64" desc="服务器ID" />
        <entry name="nick_name" type="string" size="50" desc="昵称"/>
        <entry name="desc" type="string" size="1024" desc="描述信息"/>
        <entry name="state" type="Tinyuint" defaultvalue="0" desc="用户状态 0 : AVALIABLE, 1 DELETED"/>
        <index name="index1" column="user_id"/>
        <index name="index2" column="user_id,server_id"/>
    </struct>
</metalib>
  • 元素 metalib 是 xml 文件的根元素。

  • 包含 primarykey 的 struct 元素是一个表,不包含 primarykey 的 struct 元素为一个普通结构体。

  • 每次修改表结构时,版本属性值需要相应地加 1,初始版本始终为 1。

  • primarykey 属性指定主键字段;对于 generic 表,您最多可以指定 8 个主键字段,对于 list 表,则可以指定 7 个。

  • splittablekey 属性等效于分片键(shard key),TcaplusDB 表被拆分存储到多个存储节点。splittablekey 必须是主键字段之一,一个好的 splittablekey 应该具有高度分散性,这意味着值的范围很广,建议选用字符串类型。

  • desc 属性包含当前元素的描述。

  • entry 元素定义一个字段,支持的值类型包括 int32,string,char,int64,double,short 等。

  • index 元素定义一个索引,该索引必须包含 splittablekey。由于可以使用主键查询表,因此索引不应与主键属性相同。

2.2 建表流程

预备工作:预先部署好 Tcaplus Local 版,注意需要使用 3.57.1 版本。

# step0,使用上述xml格式的表定义,保存为.xml后缀的文本,如table-define.xml。
# step1,进入OMS 页面,菜单栏处打开:业务管理=〉表管理。
# step2,页面Tab栏处,选中:表添加
# step3,选中业务和集群并勾选出来的游戏区, 集群:test_set(1), 业务:tdr_app(2), 游戏区ID: 3, 再点击:批量新增表
# step4,在出来的页面中,浏览页面底部部分,点击:从本地文件中添加,在弹出的页面中选择上述资源下载的示例表定义文件:table-define.xml
# step5,点击:提交,创建示例表: demo_table
# step6,查看表是否创建ok,进入:业务管理=>表管理,选择对应的业务(tdr_app)及游戏区(3), 查看是否出现demo_table表信息

操作示例:


step1:


<div align="left"><img src="https://tcaplusdb-img-1301716906.cos.ap-nanjing.myqcloud.com/image/02_1_step1.png" height="400" width="800" /></dev>


step2:


<div align="left"><img src="https://tcaplusdb-img-1301716906.cos.ap-nanjing.myqcloud.com/image/02_1_step2.png" height="500" width="800" /></dev>


step3:


<div align="left"><img src="https://tcaplusdb-img-1301716906.cos.ap-nanjing.myqcloud.com/image/02_1_step3.png" height="390" width="800" /></dev>


step4&5:


<div align="left"><img src="https://tcaplusdb-img-1301716906.cos.ap-nanjing.myqcloud.com/image/02_1_step4.png" height="410" width="800" /></dev>


step6:


<div align="left"><img src="https://tcaplusdb-img-1301716906.cos.ap-nanjing.myqcloud.com/image/02_1_step6.png" height="400" width="800" /></dev>

3. 快速体验

3.1 连接说明

和标准 MySQL 使用一样,连接数据库需要提供用户名、密码、数据库名称、IP 以及端口号以上信息。


  1. MySQL 的数据库的概念对应 TcaplusDB 中一个业务的一个区,使用'appid.zoneid'作为数据库名称,如示例表所在的区是2.3。

  2. MySQL 客户端或驱动连接的地址是 Tcaplus Proxy 节点的 IP + 端口,可在 OMS 的运维平台 => 集群状态页面查看 IP 和端口号。

  3. MySQL 第一次连接前,需创建对应的 MySQL 用户并赋予相应的权限,创建流程见下面图文指引。


查看 Proxy 节点的 MySQL 连接地址,任意属于'appid.zoneid'的 proxy 都可以:


<div align="left"><img src="images/03_proxy_mysql_url.png" /></dev>


创建 MySQL 用户:


step0,打开对应业务的维护中心。


<div align="left"><img src="images/03_app_user_entry.png" /></dev>


step1,创建用户,填写用户名和密码。


<div align="left"><img src="images/03_create_mysql_user.png" /></dev>


step2,联系运维审核通过,若当前操作者具有权限可以自己审核通过即可。


<div align="left"><img src="images/03_check_mysql_user.png" /></dev>


step3,给该用户赋予读写权限,这里赋予在该 app 下所有 zone 的读写权限。


<div align="left"><img src="images/03_user_authority.png" /></dev><div align="left"><img src="images/03_user_authority_details.png" /></dev>


说明:TcaplusDB 当前只支持mysql_native_password插件鉴权,同时也是 MySQL 5.7 的默认连接鉴权。

3.2 体验示例(使用 mysql client)

与连接 MySQL 一样,执行以下命令,使用 MySQL 的 client 工具即可连接 TcaplusDB 的 proxy

mysql -u user_name -p user_passwd --port=15755 --host=xxx.xxx.xxx.xxx 2.3

3.3 体验示例(使用 .NET mysql driver)

兼容 MySQL 5.7 协议的 MySQL Driver 均可正常访问数据库。此处使用 .NET 5.0 和 MySQL Connector/NET 8.0.25 对初始化连接的过程进行演示。


public class Database
{
    static MySqlConnection conn;                // MySql连接
    const String server = "xxx.xxx.xxx.xxx";    // 服务器地址,客户端要连接的 proxy 节点的 IP
    const String port = "15755";                // 端口号,客户端要连接的 proxy 节点的 Port
    const String uid = "user_name";             // 用户名
    const String pw = "user_passwd";            // 密码
    const String db = "2.3";                    // 库名,由TcaplusDB中的业务ID和分区ID拼接而成

    public static Boolean Init()
    {
        try
        {
            if (conn == null)
            {
                conn = new MySqlConnection("server=" + server + ";port=" + port + ";user id=" + uid + ";password=" + pw + ";database=" + db);
                conn.Open();
                Console.WriteLine("database connected.");
            }
            return true;
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception caught: {0}", e);
            return false;
        }
    }
}

4. 数据类型支持

TcaplusDB 和 MySQL 数据类型对应关系


5. SQL 语法使用参考

假设数据表 demo 共有 5 个字段:key1, key2, key3, value1, value2,其中,key1, key2 为 partkey,key1, key2, key3 组成 fullkey。

5.1 插入操作

插入单条记录的 SQL 语句形式如下:

INSERT INTO demo (key1,key2,key3,value1,value2) values (x1,x2,x3,x4,x5);
插入多条记录的 SQL 语句形式如下:
INSERT INTO demo (key1,key2,key3,value1,value2) values (x1,x2,x3,x4,x5); INSERT INTO demo (key1,key2,key3,value1,value2) values (x6,x7,x8,x9,x10);

5.2 where 子句语法限制

在未配置全局索引的情况下,where 子句由两部分组成:1、必选部分:partkey 或 fullkey;2、可选部分:过滤条件。


partkey 或 fullkey:只能进行等值查询,且组成 partkey 或 fullkey 的各个字段之间只能用 AND 连接;


过滤条件:支持 NOT、=、>、<、!=、>=、<=运算符,且多个过滤条件之间可以用 AND 或 OR 连接,支持 key 字段或 value 字段。


1、使用 fullkey 进行删改查时的 where 子句形式如下:

WHERE key1=x1 AND key2=x2 AND key3=x3;

2、使用 fullkey+过滤条件进行删改查时的 where 子句形式如下,若过滤条件中包含 OR 运算符,则必须对过滤条件加括号:

WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);
3、使用 partkey 进行删改查时的 where 子句形式如下:
WHERE key1=x1 AND key2=x2;
4、使用 partkey+过滤条件进行删改查时的 where 子句形式如下,若过滤条件中包含 OR 运算符,则必须对过滤条件加括号:
WHERE key1=x1 AND key2=x2 AND (过滤条件);

当 where 子句中的必选部分为 partkey 时,where 子句的执行结果可能是多条记录。

5.3 删除操作

1、通过 fullkey 删除单条记录时,SQL 语句有以下两种形式:

DELETE FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3;DELETE FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);

2、通过 fullkey 批量删除记录时,SQL 语句形式如下:

DELETE FROM demo WHERE (key1=x1 AND key2=x2 AND key3=x3)&nbs***bsp;(key1=x4 AND key2=x5 AND key3=x6);

删除/批量删除操作不支持 partkey,批量删除操作暂不支持过滤条件。

5.4 更新操作

1、通过 fullkey 更新单条记录时,SQL 语句有以下两种形式:

UPDATE demo SET value1=x1, value2=x2 WHERE key1=x1 AND key2=x2 AND key3=x3;UPDATE demo SET value1=x1, value2=x2 WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);

2、通过 fullkey 批量更新记录时,SQL 语句形式如下:
UPDATE demo SET value1=x1, value2=x2 WHERE (key1=x3 AND key2=x4 AND key3=x5)&nbs***bsp;(key1=x6 AND key2=x7 AND key3=x8);

更新/批量更新操作不支持 partkey,批量更新操作暂不支持过滤条件。

5.5 查询操作

1、通过 fullkey 查询单条记录时,SQL 语句有以下四种形式:

SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3;SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3;SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);
2、通过 partkey 查询多条记录时,SQL 语句有以下四种形式:

SELECT * FROM demo WHERE key1=x1 AND key2=x2;SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND (过滤条件);SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2;SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2 AND (过滤条件);
3、通过 fullkey 批量查询记录时,SQL 语句的形式如下:
SELECT * FROM demo WHERE (key1=x1 AND key2=x2 AND key3=x3)&nbs***bsp;(key1=x4 AND key2=x5 AND key3=x6);

批量查询操作暂不支持过滤条件。

4、通过 partkey 批量查询记录时,SQL 语句的形式如下:

SELECT * FROM demo WHERE (key1=x1 AND key2=x2)&nbs***bsp;(key1=x3 AND key2=x4);

批量查询操作暂不支持过滤条件。

6. 全局索引查询

TcaplusDB 提供 sql 查询语句进行索引查询,其中,sql 查询条件中的字段必须是建立了全局索引的字段。另外,如果是聚合查询,则聚合字段也必须是建立了全局索引的字段。当前版本中,每个索引查询请求最多返回 3000 条记录。


由于数据同步到全局索引模块最多需要 1 秒钟的时间,因此,当执行插入或更新操作以后,最多需要 1 秒左右时间可以查询到最新数据。

6.1 支持的 sql 查询语句

条件查询

支持 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:

SELECT * FROM `mail` WHERE user_id>="10004" AND server_id=100;SELECT * FROM `mail` WHERE user_id BETWEEN 10000 AND 10003 AND server_id=100;SELECT * FROM `mail` WHERE user_id="10000" AND server_id=100 AND mail_id LIKE "210507%";SELECT * FROM `mail` WHERE user_id>="10004"&nbs***bsp;server_id<=200;

注意:between 查询时,between a and b,对应的查询范围为[a, b];like 查询是支持模糊匹配,其中"%"通配符,匹配 0 个或者多个字符; “_”通配符,匹配 1 个字符;

分页查询

支持 limit offset 分页查询,比如:

SELECT * FROM mail WHERE user_id>"10000" LIMIT 100 OFFSET 2;

注意:当前 limit 必须与 offset 搭配使用,不支持 limit 1 或者 limit 0, 1

聚合查询

当前支持的聚合查询包括:sum, count, max, min, avg,比如:

SELECT server_id, COUNT(DISTINCT user_id), COUNT(*), SUM(state) FROM \`mail\` WHERE user_id>="10000" AND server_id=100;

注意:聚合查询不支持 limit offset,即 limit offset 不生效;目前只有 count 支持 distinct,即select count(distinct(a)) from table where a > 1000;其他情况均不支持 distinct。




TcaplusDB 是腾讯出品的分布式 NoSQL 数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB 级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。

#java##Java##后端开发##MySQL#
全部评论
不了解这个数据库。
点赞 回复 分享
发布于 2022-04-27 17:45

相关推荐

评论
1
1
分享
牛客网
牛客企业服务