Tidb索引数据结构(LSM-TREE)

本文介绍了 TiDB 底层的 LSM-Tree 索引结构及其对事务处理的影响,包括与 MySQL 事务的差异,以及在查询优化上的挑战。文章探讨了如何通过事务串行化、SQL 优化和批处理等方式来提高 TiDB 的性能和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 TiDB 中,底层索引结构为 LSM-Tree,如下图:

2019012327.png

 

开篇

世界级的开源分布式数据库 TiDB 自 2016 年 12 月正式发布第一个版本以来,业内诸多公司逐步引入使用,并取得广泛认可。

对于互联网公司,数据存储的重要性不言而喻。在 NewSQL 数据库出现之前,一般采用单机数据库(比如 MySQL )作为存储,随着数据量的增加,“分库分表”是早晚面临的问题,即使有诸如 MyCat、ShardingJDBC 等优秀的中间件,“分库分表”还是给 RD 和 DBA 带来较高的成本; NewSQL 数据库出现后,由于它不仅有 NoSQL 对海量数据的管理存储能力、还支持传统关系数据库的 ACID 和 SQL,所以对业务开发来说,存储问题已经变得更加简单友好,进而可以更专注于业务本身。而 TiDB,正是 NewSQL 的一个杰出代表!

站在业务开发的视角,TiDB 最吸引人的几大特性是:

支持 MySQL 协议(开发接入成本低);

100% 支持事务(数据一致性实现简单、可靠);

无限水平拓展(不必考虑分库分表)。

基于这几大特性,TiDB 在业务开发中是值得推广和实践的,但是,它毕竟不是传统的关系型数据库,以致我们对关系型数据库的一些使用经验和积累,在 TiDB 中是存在差异的,现主要阐述“事务”和“查询”两方面的差异。

TiDB 事务和 MySQL 事务的差异

MySQL 事务和 TiDB 事务对比

2019012321.png

在 TiDB 中执行的事务 b,返回影响条数是 1 (认为已经修改成功),但是提交后查询,status 却不是事务 b 修改的值,而是事务 a 修改的值。

可见,MySQL 事务和 TiDB 事务存在这样的差异:

MySQL 事务中,可以通过影响条数,作为写入(或修改)是否成功的依据;而在 TiDB 中,这却是不可行的!

作为开发者我们需要考虑下面的问题:

<think>嗯,用户问的是如何在TiDB中修改lower_case_table_names参数的设置方法和注意事项。首先,我需要回忆一下之前学过的关于TiDB的知识,尤其是关于表名大小写处理的。记得在MySQL中,lower_case_table_names参数用来控制表名的大小写敏感性和存储方式,但TiDB在这方面的处理可能有所不同。 根据引用[1],TiDB的lower-case-table-names参数只能设置为2,这意味着存储表名时会区分大小写,但在比较时会转为小写。所以用户可能想修改这个参数,但需要注意TiDB的限制。用户的问题可能源于在迁移数据库或者其他系统集成时遇到表名大小写不一致的问题。 接下来,我需要确认TiDB是否允许修改这个参数。根据引用内容,TiDB的这个参数只能被设置成2,无法更改为其他值。因此,用户可能无法像在MySQL中那样调整这个参数。这时候,我需要告诉用户这个限制,并建议他们遵循全小写的表名命名规范,以避免问题。 另外,引用[3]提到DataEase使用外接数据库时修改lower_case_table_names=1不生效的问题,但这里可能指的是MySQL的情况,而TiDB的处理方式不同。因此需要明确区分TiDB和MySQL在这一点上的差异。 用户可能还关心如何在TiDB中处理表名大小写的兼容性问题。需要建议他们在应用层统一使用小写,或者在创建表时显式指定表名的大小写形式。此外,检查现有数据库中是否有混合大小写的表名,并进行统一调整,避免因大小写问题导致的查询错误。 还要注意,TiDB的系统变量tidb_allow_remove_auto_inc(引用[2])可能这个问题无关,但需要确保不混淆其他参数。最后,总结注意事项,强调参数不可修改以及最佳实践,帮助用户避免常见的陷阱。</think>### TiDB中修改lower_case_table_names参数的设置方法及注意事项 #### 1. 参数特性说明 TiDB的`lower-case-table-names`参数**只能设置为固定值2**,该参数控制以下行为: - **存储时**:区分表名大小写(例如`Table1`和`table1`会被视为两个不同的表) - **对比时**:统一转为小写处理(查询时`SELECT * FROM TABLE1`会自动转为`table1`)[^1] #### 2. 配置方法 该参数**不支持动态修改**,必须在TiDB集群初始化时通过配置文件指定: ```yaml # tidb-config.yaml lower-case-table-names: 2 ``` 若已存在集群,则无法修改此参数,需**重建集群**才能生效。 #### 3. 关键注意事项 - **命名规范建议**:所有表名、库名建议使用**全小写字母**命名,避免混合大小写造成的兼容性问题 - **跨平台迁移**:从MySQL迁移到TiDB时,需提前检查是否存在同名不同大小写的表(例如`User`和`user`),TiDB会识别为两个独立表 - **MySQL差异**:MySQL支持设置为0/1/2,而TiDB强制限定为2,这是二者的核心差异点[^3] - **应用层适配**:建议在应用程序中统一使用小写表名进行访问,避免隐式转换带来的性能损耗 #### 4. 异常处理示例 当出现表名大小写冲突时,可通过以下SQL检查: ```sql SELECT table_schema,table_name FROM information_schema.tables WHERE LOWER(table_name) IN (需检查的表名列表); ``` #### 5. 替代方案 若需要实现类似MySQL的`lower_case_table_names=1`效果(存储和对比都转为小写),可通过以下组合方案: 1. 应用层强制转换为小写 2. 使用视图统一访问路径 3. 通过SQL审核工具拦截混合大小写的DDL语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值