TDSQL自增列:

Mysql 的innodb中常用自增列来存储某表的唯一ID例,每次mysqld启动后首次打开这个表时,把这个索引的最大值取出来作为自增例的起始值,并且存储在内存中,然后mysqld运行期间妈可维护和使用这个自增例值。

TDSQL 作为高度兼容MYSQL语法的数据库,自然也是有全局唯一自增列这一功能。 关键字auto_increment,即支持一个全局的自增字段,auto_increment 可以保证该表某个字段全局唯一,但不保证单调递增 。TDSQL自增例的值是保存在Zk组件中的,当Proxy启动后,会从ZK中取一个号段,每个Proxy 都是从ZK中取的唯一号段,所以它能保证唯一;但是由于它取的是号段,当SQL选择不同的Proxy时对SQL操作时,它不能保证连续,如果Proxy 挂掉,在恢复的时候会重新向ZK去请求一个号段。这样的好处,不用频繁的去ZK中取,避免了资源竞争,有利于性能的提长。

#创建自增例的表,

这种设计方式实现了分布式环境下的自增属性全局唯一。每个Proxy缓存一定数量的值,并且增加单独线程负责向ZK申请值,使得性能影响降到最低,同时具有容灾特性,即使Proxy挂了或者重启,都能保证全局唯一。但是缺点是:多个Proxy一起使用的时候,只能保证全局唯一,不能保证单调递增。

下面我们来验证自增例:

#1.创建一张带有自增例的表

MySQL [–c]> mysql -uhuyi -phuyi -h10.85.10.51 -P15002 –c

MySQL [–c]> create database huyidb ;

MySQL [–c]> create table huyidb.test4 ( a int auto_increment , b int , c char(20),primary key (a),unique key u_2(a,c) ) shardkey=a;

Query OK, 0 rows affected (0.75 sec)

#2.在Porxy1 插入5条数据

mysql -uhuyi -phuyi -h10.85.10.51 -P15002 –c

insert into huyidb.test4 ( a,b, c) values (0,10, 'huyi01') ;

insert into huyidb.test4 ( a,b, c) values (0,20, 'huyi02') ;

insert into huyidb.test4 ( a,b, c) values (0,30, 'huyi03') ;

insert into huyidb.test4 ( a,b, c) values (0,40, 'huyi04') ;

insert into huyidb.test4 ( a,b, c) values (0,50, 'huyi05') ;

select last_insert_id() ;

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,10, 'huyi01') ;

Query OK, 1 row affected (0.01 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,20, 'huyi02') ;

Query OK, 1 row affected (0.01 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,30, 'huyi03') ;

Query OK, 1 row affected (0.01 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,40, 'huyi04') ;

Query OK, 1 row affected (0.00 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,50, 'huyi05') ;

Query OK, 1 row affected (0.00 sec)

#3.当前最大自增例的值是5

MySQL [–c]> select last_insert_id() ;

+------------------+

| last_insert_id() |

+------------------+

| 5 |

+------------------+

1 row in set (0.00 sec)

#4.在Porxy2插入5条数据

mysql -uhuyi -phuyi -h10.85.10.52 -P15002 –c

insert into huyidb.test4 ( a,b, c) values (0,12, 'huyi21') ;

insert into huyidb.test4 ( a,b, c) values (0,22, 'huyi22') ;

insert into huyidb.test4 ( a,b, c) values (0,32, 'huyi23') ;

insert into huyidb.test4 ( a,b, c) values (0,42, 'huyi24') ;

insert into huyidb.test4 ( a,b, c) values (0,55, 'huyi25') ;

select last_insert_id() ;

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,12, 'huyi21') ;

insert into huyidb.test4 ( a,b, c) values (0,22, 'huyi22') ;

Query OK, 1 row affected (0.01 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,22, 'huyi22') ;

Query OK, 1 row affected (0.00 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,32, 'huyi23') ;

Query OK, 1 row affected (0.01 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,42, 'huyi24') ;

Query OK, 1 row affected (0.01 sec)

MySQL [–c]> insert into huyidb.test4 ( a,b, c) values (0,55, 'huyi25') ;

Query OK, 1 row affected (0.00 sec)

#5.当前最大自增例是2005,说明自增例是不保证连续的

MySQL [–c]> select last_insert_id() ;

+------------------+

| last_insert_id() |

+------------------+

| 2005 |

+------------------+

1 row in set (0.00 sec)

#6.模拟Proxy1挂掉

ps -ef |grep gateway |grep 15002

ps -ef |grep gateway |grep 15002 | grep -v 'grep'| awk '{print $2}' | xargs kill -9

ps -ef |grep gateway |grep 15002

#7.待Proxy1重新挂起后,再次插入5条数据

mysql -uhuyi -phuyi -h10.85.10.51 -P15002 -c

insert into huyidb.test4 ( a,b, c) values (0,13, 'huyi31') ;

insert into huyidb.test4 ( a,b, c) values (0,23, 'huyi32') ;

insert into huyidb.test4 ( a,b, c) values (0,33, 'huyi33') ;

insert into huyidb.test4 ( a,b, c) values (0,43, 'huyi34') ;

insert into huyidb.test4 ( a,b, c) values (0,53, 'huyi35') ;

MySQL [(none)]> insert into huyidb.test4 ( a,b, c) values (0,13, 'huyi31') ;

Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> insert into huyidb.test4 ( a,b, c) values (0,23, 'huyi32') ;

Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> insert into huyidb.test4 ( a,b, c) values (0,33, 'huyi33') ;

Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> insert into huyidb.test4 ( a,b, c) values (0,43, 'huyi34') ;

Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> insert into huyidb.test4 ( a,b, c) values (0,53, 'huyi35') ;

Query OK, 1 row affected (0.00 sec)

#8.当前的自增例跳到5005, 也就是说在proxy网关故障恢复后,会重新从zk中获取一段唯一

MySQL [(none)]> select last_insert_id() ;

+------------------+

| last_insert_id() |

+------------------+

| 5005 |

+------------------+

1 row in set (0.00 sec)

MySQL [(none)]> select * from huyidb.test4 ;

+------+------+--------+

| a | b | c |

+------+------+--------+

| 1 | 10 | huyi01 |

| 2005 | 55 | huyi25 |

| 5002 | 23 | huyi32 |

| 2004 | 42 | huyi24 |

| 2002 | 22 | huyi22 |

| 2001 | 12 | huyi21 |

| 2 | 20 | huyi02 |

| 5004 | 43 | huyi34 |

| 5 | 50 | huyi05 |

| 3 | 30 | huyi03 |

| 2003 | 32 | huyi23 |

| 5005 | 53 | huyi35 |

| 5003 | 33 | huyi33 |

| 5001 | 13 | huyi31 |

| 4 | 40 | huyi04 |

+------+------+--------+

15 rows in set (0.00 sec);

从网关日志中可以看出, 在ZK中获取了相关的路由信息,shardkey , 以及自己增例等信息。

more /data/tdsql_run/15002/gateway/log/sys_instance_15002.2020-12-29.0/data/tdsql_run/15002/gateway/log/

main/proxy-zookeeper.c:275:get_new_id,tid:0x7f3c9d3f5700,con:(nil),get_new_id current:0,old_value:7000,step:1000,db_table:huyidb.test4

main/proxy-zookeeper.c:139:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),deal_one_path :/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test4/alter_seqid,event:3

main/proxy-zookeeper.c:287:get_new_id,tid:0x7f3c9d3f5700,con:(nil),get_new_id,set_path node:/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test4/current_id,new_value:8000,return :7000,

main/auto_inc.h:109:get_new_id,tid:0x7f3c9d3f5700,con:(nil),get_new_id:7000 from zk,can use (7000,8000] for db_table:huyidb.test4

main/proxy-zookeeper.c:170:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),in deal_one_path:/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test4/alter_seqid,got a new value:0 for db_table:h

main/proxy-zookeeper.c:139:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),deal_one_path :/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test4/current_id,event:3

main/proxy-zookeeper.c:275:get_new_id,tid:0x7f3c9d3f5700,con:(nil),get_new_id current:0,old_value:5000,step:1000,db_table:huyidb.test5

main/proxy-zookeeper.c:139:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),deal_one_path :/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test5/alter_seqid,event:3

main/proxy-zookeeper.c:287:get_new_id,tid:0x7f3c9d3f5700,con:(nil),get_new_id,set_path node:/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test5/current_id,new_value:6000,return :5000,

main/auto_inc.h:109:get_new_id,tid:0x7f3c9d3f5700,con:(nil),get_new_id:5000 from zk,can use (5000,6000] for db_table:huyidb.test5

main/proxy-zookeeper.c:170:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),in deal_one_path:/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test5/alter_seqid,got a new value:0 for db_table:h

main/proxy-zookeeper.c:139:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),deal_one_path :/tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test5/current_id,event:3

main/proxy-zookeeper.c:139:deal_one_path,tid:0x7f3c9f3f7700,con:(nil),deal_one_path :/tdsqlzk/group_1609208018_42/groupdcn,event:3

main/proxy-extend.cpp:457:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread version is not equal to gloabl,so update version to:6,after update:

main/proxy-extend.cpp:460:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread update groupstatus to :0

main/proxy-extend.cpp:463:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route set_range set_name:set_1609208277_1,range:0-31

main/proxy-extend.cpp:463:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route set_range set_name:set_1609208653_3,range:32-63

main/proxy-extend.cpp:465:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route set_slice set_name:set_1609208277_1,slice:0

main/proxy-extend.cpp:465:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route set_slice set_name:set_1609208653_3,slice:0

main/proxy-extend.cpp:468:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_shardkey dbtable:huyidb.test4,shardkey:a

main/proxy-extend.cpp:468:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_shardkey dbtable:huyidb.test5,shardkey:a

main/proxy-extend.cpp:491:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_auto_inc dbtable:huyidb.test4,auto_inc:a

main/proxy-extend.cpp:491:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_auto_inc dbtable:huyidb.test5,auto_inc:a

main/proxy-extend.cpp:494:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_auto_inc_type dbtable:huyidb.test4,auto_inc_type:0

main/proxy-extend.cpp:494:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_auto_inc_type dbtable:huyidb.test5,auto_inc_type:0

main/proxy-extend.cpp:496:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_auto_inc_step dbtable:huyidb.test4,auto_inc_step:1000

main/proxy-extend.cpp:496:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread route dbtable_auto_inc_step dbtable:huyidb.test5,auto_inc_step:1000

main/proxy-extend.cpp:512:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread sets master set_name:set_1609208277_1,ip:10.85.10.51:4005

main/proxy-extend.cpp:512:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread sets master set_name:set_1609208653_3,ip:10.85.10.51:4006

main/proxy-extend.cpp:514:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread sets master set_name:set_1609208277_1,status:0

main/proxy-extend.cpp:514:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread sets master set_name:set_1609208653_3,status:0

main/proxy-extend.cpp:516:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread sets slave set_name:set_1609208277_1,ip:10.85.10.52:4005@1@IDC_CQ_YB_9527_02@0,10.85.10.53:4005@1@IDC_CQ_YB_9527_03

main/proxy-extend.cpp:516:print_backend_info,tid:0x7f3ce6fff700,con:(nil),thread sets slave set_name:set_1609208653_3,ip:10.85.10.52:4006@1@IDC_CQ_YB_9527_02@0,10.85.10.53:4006@1@IDC_CQ_YB_9527_03

那自增例里面的值,多个表可以混用么?我们创建第二个自增例的表来确认一下。

create table huyidb.test5 ( a int auto_increment , b int , c char(20),primary key (a),unique key u_2(a,c) ) shardkey=a;

mysql -uhuyi -phuyi -h10.85.10.51 -P15002 -c

MySQL [(none)]> insert into huyidb.test5 ( a,b, c) values (0,55, 'huyi55') ;

Query OK, 1 row affected (0.01 sec)

#从结果可以看出,每个表的自增例都是独立的, 表与表之间的自增例不能混用

MySQL [(none)]> select last_insert_id() ;

| last_insert_id() |

+------------------+

| 1 |

+------------------+

1 row in set (0.00 sec)

#同时不能在一个表上创建2个自增例

MySQL [(none)]> create table huyidb.test6 ( a int auto_increment , b int auto_increment, c char(20),primary key (a),unique key u_2(a,c) ) shardkey=a;

ERROR 688 (HY000): Proxy ERROR:Complex sql can not used to create shard tables

我们从ZK中查看是如何分配的,我们以test5 表为例;

首先我们查看zk中当前最大的自增例的值是5000

[zk: localhost:2181(CONNECTED) 8] get /tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test5/current_id

5000

cZxid = 0x359bf

ctime = Tue Dec 29 10:37:27 CST 2020

mZxid = 0x35dfb

mtime = Tue Dec 29 10:38:57 CST 2020

pZxid = 0x359bf

cversion = 0

dataVersion = 5

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 4

numChildren = 0

2.我们在次kill proxy进程,模拟故障, 待网关恢复后,我发现新插入的值为5001

[root@tdsql1 bin]# mysql -uhuyi -phuyi -h10.85.10.51 -P15002 -c

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MySQL connection id is 3347

Server version: 5.7.17-11-V2.0R540D002-20191226-1152-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> insert into huyidb.test5 ( a,b, c) values (0,55, 'huyi55') ;

Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> select last_insert_id() ;

+------------------+

| last_insert_id() |

+------------------+

| 5001 |

+------------------+

1 row in set (0.00 sec)

3.同时我要在zk中查看当前最大的值为6000, 即验证了我们最初图中所说,proxy是从zk中取一段自增例缓存到proxy中。

[zk: localhost:2181(CONNECTED) 9] get /tdsqlzk/group_1609208018_42/sequenceids/sequenceid@huyidb.test5/current_id

6000

cZxid = 0x359bf

ctime = Tue Dec 29 10:37:27 CST 2020

mZxid = 0x371d9

mtime = Tue Dec 29 10:45:55 CST 2020

pZxid = 0x359bf

cversion = 0

dataVersion = 6

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 4

numChildren = 0

目前 select last_insert_id() 只能跟 shard 表和广播表的自增字段一起使用,不支持 noshard 表。

自增例的缺陷:

每个表只能有一个自增列,并且这个自增列必须是一个索引的第一列。

同时,一个自增序列无法给多个表使用。

3.无法独立引用(refer to)一个表的自增列的当前值(last_insert_id无法指定某个表)

mysql tdsql_TDSQL FOR MYSQL 内部的自增例介绍相关推荐

  1. python操作三大主流数据库(6)python操作mysql⑥新闻管理后台功能的完善(增、ajax异步删除新闻、改、查)...

    python操作mysql⑥新闻管理后台功能的完善(增.删.改.查) 安装表单验证 D:\python\python_mysql_redis_mongodb\version02>pip inst ...

  2. MySQL为什么要用数字做自增主键?

    1.MySQL为什么要用数字做自增主键? 首先为什么我们使用的是int类型,而不是varchar类型 int永远是固定的4个字节,而char类型是1~255字节之间 优点 占用空间小,节省CPU开销 ...

  3. Alibaba之MySQL宝典_阿里巴巴内部 MySQL宝典 意外流出!极致经典,堪称数据库的天花板...

    MySQL 是一个关系型数据库,使用 SQL 语言进行增删改查操作,目前属于 Oracle 旗下的产品. MySQL 数据库开源免费,能够跨平台,支持分布式,性能也不错,可以和 PHP.Java 等 ...

  4. mysql事务回滚后,自增ID仍然增加

    事务回滚后,自增ID仍然增加 回滚后,自增ID仍然增加. 比如当前ID是7,插入一条数据后,又回滚了. 然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9. 因为虽然你之前插入回滚,但是 ...

  5. eggjs增删改查MySQL,nodejs操作mysql实现增删改查

    首先需要安装mysql模块:npm install mysql –save 然后创建user数据表: 接着使用nodejs对数据库进行增删改查: //引入mysql模块 var mysql = req ...

  6. [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程

    [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 http://mysqllover.com/?p=581 尽管Mariadb以及Facebook在long ...

  7. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  8. MySQL设置字段从指定数字自增,比如10000

    MySQL设置字段从指定数字自增,比如10000. 方式一 方式二 方式一 此时就解决了MySQL从指定数字进行自增 CREATE TABLE hyxxb(hyid INT AUTO_INCREMEN ...

  9. MySQL查询时记录行号rownum MySQL查询显示行号MySQL查询显示行号MySQL流水号自MySQL自增行号

    MySQL查询时记录行号rownum MySQL查询显示行号MySQL查询显示行号MySQL流水号自MySQL自增行号 一.前言 Oracle中有rownum,实现查询的时候记录行号,MySQL中没有 ...

最新文章

  1. 马斯克蝉联美国CEO薪酬榜No.1,年入41亿,库克皮猜纳德拉加起来都没他高
  2. python dataframe 计算上下两行的差值_用Python进行数据清洗!
  3. 你有什么技能是公司离不开你
  4. Leetcode 283. 移动零 解题思路及C++实现
  5. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例
  6. jquery导航,按钮等特效 - apycom
  7. 10种自动音乐播放器代码
  8. 特洛伊木马程序开发技术
  9. 使用python的netCDF4库读取.nc文件 和 创建.nc文件
  10. 选择IT行业的自我心得,希望能帮助到各位!(一)
  11. GNU ARM Toolchain 初学者入门指南
  12. 全加器,半加器公式推演
  13. Knowledge Representation笔记
  14. 基于深度强化学习构建量化投资策略
  15. ‘com.cloudera.server.cmf.TrialState‘:Cannot resolve reference to bean ‘entityManagerFactoryBean‘
  16. 【SpringSecurity】SpringSecurity2.7.x 的使用(03)
  17. 悬赏任务小程序搭建抖音点赞app任务发布接单平台任务分销公众号开发
  18. 关于antV G6中的on事件、util.each事件及update方法等的使用总结
  19. 解决华为手机需要打开位置信息才能定位
  20. springboot 上传图片存储在后台,并指定存储路径

热门文章

  1. 零基础入门3D游戏建模师知识必备
  2. 高德地图——路线规划
  3. Ubuntu16.04+cuda8.0+GTX TITAN X安装配置
  4. 从美团实习生到上市公司CEO,沈鹏的自我训练心法
  5. 字符串转换为数字---‘123456’转换为123456--函数中嵌套函数
  6. linux 基础及常用命令
  7. 如何给妹子优化 Windows ?
  8. php智能搜索,WordPress中文分词与智能搜索
  9. opc通讯配置、Dcom配置、wincc opc通讯配置(避坑版)
  10. 我的学习计划,反思……