tidb使用坑记录

1、对硬盘要求很高,没上SSD硬盘的不建议使用

2、不支持分区,删除数据是个大坑。

解决方案:set @@session.tidb_batch_delete=1; 

3、插入数据太大也会报错

解决方案:set @@session.tidb_batch_insert=1; 

4、删除表数据时不支持别名

delete from 表名 表别名 where 表别名.col = '1'  会报错

5、内存使用有问题,GO语言导致不知道回收机制什么时候运作。内存使用过多会导致TIDB当机(这点完全不像MYSQL)

测试情况是,32G内存,在10分钟后才回收一半。

6、数据写入的时候,tidb压力很大, tikv的CPU也占用很高

7、不支持GBK

8、不支持存储过程

9、列数支持太少,只支持100列,和oralce/mysql的1000列少太多(Oracle 最大列数为 1000;MySQL对于每个表具有4096个列的硬限制, 其中InnoDB每个表的限制为1017列, 最大行大小限制为65,535字节)

外面文章的一些建议

3TiKV+3PD+2TiDB

在有了 TiSpark 之后,我们便利用 TiSpark 将中间表缓存为 Spark 的内存表,只需要将最后的数据落地回 TiDB,再执行 Merge 操作即可,这样省掉了很多中间数据的落地,大大节省了很多脚本执行的时间

在查询速度解决之后,我们发现脚本中会有很多针对中间表 update 和 delete 的语句。目前 TiSpark 暂时不支持 update 和 delete 的操作(和 TiSpark 作者沟通,后续会考虑支持这两个操作),
我们便尝试了两种方案,一部分执行类似于 Hive,采用 insert into 一张新表的方式来解决;另外一部分,我们引入了 Spark 中的 Snappydata 作为一部分内存表存储,
在 Snappydata 中进行 update 和 delete,以达到想要的目的。因为都是 Spark 的项目,因此在融合两个项目的时候还是比较轻松的。

最后,关于实时的调度工具,目前我们是和离线调度一起进行调度,这也带来了一些问题,每次脚本都会初始化一些 Spark 参数等,这也相当耗时。在未来,我们打算采用 Spark Streaming 作为调度工具,
每次执行完成之后记录时间戳,Spark Streaming 只需监控时间戳变化即可,能够避免多次初始化的耗时,通过 Spark 监控,我们也能够清楚的看到任务的延迟和一些状态,这一部分将在未来进行测试。

### TiDB 使用教程与配置指南 #### 启动 TiDB 集群 通过 `tiup` 工具可以快速启动一个本地的 TiDB 测试集群。默认情况下,执行以下命令将会运行最新版本的 TiDB 集群,其中包括 1 个 TiDB 实例、1 个 PD (Placement Driver) 实例和 1 个 TiKV 实例[^1]。 ```bash tiup playground ``` 如果需要自定义集群的版本或者调整各个组件的数量,则可以通过参数指定具体的版本号以及每种服务的实例数量。例如: ```bash tiup playground v6.3.0 --db 2 --pd 3 --kv 3 ``` 上述命令表示创建两个 TiDB 节点、三个 PD 节点和三个 TiKV 节点组成的测试环境,并基于特定版本 `v6.3.0` 运行。 #### 关于 tidb-ansible 的注意事项 部分用户可能习惯采用传统的 Ansible 方式来管理 TiDB 部署流程,在此过程中容易因选用不匹配的工具版本而引发兼容性问题。因此需要注意的是,不同分支下的 `tidb-ansible` 可能对应不同的 TiDB 主程序版本;此外熟悉其基本目录布局及功能模块有助于更高效完成初始化设置工作[^2]。 #### 数据库选型建议中的 TiDB 提到 当考虑项目技术栈时,对于那些追求高可用性和分布式事务特性的场景来说,TiDB 是一种非常优秀的解决方案选项之一。它不仅提供了 MySQL 协议层面上的高度兼容能力,还继承了 NewSQL 类产品的弹性扩展优势[^3]。 --- ### 示例代码片段展示如何连接至已搭建好的 Playground 环境 下面给出一段 Python 脚本用于演示怎样利用 pymysql 库访问刚才建立起来的那个简易版 TiDB Cluster: ```python import pymysql.cursors connection = pymysql.connect( host='127.0.0.1', user='root', password='', database='test_db', cursorclass=pymysql.cursors.DictCursor ) try: with connection.cursor() as cursor: sql_create_table = """ CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT ); """ cursor.execute(sql_create_table) finally: connection.close() ``` 以上脚本实现了向新表写入数据前先确认目标表格是否存在并按需构建的功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值