请问是tidb否有逻辑表这样的概念

来自tidb.ai
在TiDB中,逻辑表(logical table)是指数据库中用于存储和组织数据的基本结构单元。以下是关于TiDB逻辑表的一些关键信息:

  1. 定义:
  • 逻辑表是TiDB集群中的一个逻辑对象,从属于数据库1。
  • 它用于存储从SQL语句发送的数据1。
  1. 结构:
  • 表由行和列组成1。
  • 每一行代表一条数据记录,每一列代表一个特定的字段或属性1。
  • 一个表至少要有一列1。
  • 如果定义了n列,那么每一行数据都有相同的n个字段1。
  1. 数据类型:
  • 每一列只允许一种数据类型2。
  • 可以通过添加约束来进一步限定列的属性2。
  1. 性能优化:
  • 可以添加生成列来加速计算2。
  • 可以创建索引来提高查询性能3。
  1. 与其他对象的关系:
  • 表是数据库中的一个对象,与索引等其他对象一起构成数据库4。
  • TiDB还支持与表处于同一级别的其他逻辑对象,如视图、序列和临时表5。
  1. 特点:
  • TiDB的表结构与MySQL兼容,使用MySQL兼容的语法6。
  • 支持主键和二级索引3。
  • 主键的定义与InnoDB(MySQL的常用存储引擎)有所不同3。
  1. 创建和管理:
  • 可以使用SQL语句创建、修改和删除表7。
  • TiDB提供了一个默认的test数据库,但建议创建自己的数据库来存储表4。

示例SQL:

-- 创建一个名为 'employees' 的表
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    department VARCHAR(50)
);

-- 插入数据
INSERT INTO employees (id, name, age, department) 
VALUES (1, '张三', 30, '销售'),
       (2, '李四', 35, '市场'),
       (3, '王五', 28, '技术');

-- 查询数据
SELECT * FROM employees WHERE age > 30;

-- 创建索引以提高查询性能
CREATE INDEX idx_department ON employees(department);

-- 添加约束
ALTER TABLE employees ADD CONSTRAINT check_age CHECK (age > 18);

-- 创建生成列
ALTER TABLE employees ADD COLUMN full_info VARCHAR(200) 
GENERATED ALWAYS AS (CONCAT(name, ' (', age, ') - ', department));

-- 查询包含生成列的数据
SELECT id, full_info FROM employees;

这些SQL示例展示了如何在TiDB中创建表、插入数据、查询数据、创建索引、添加约束以及使用生成列。这些操作都是在TiDB中管理和使用逻辑表的常见方式。

Footnotes

  1. Dev Guide: Create Table | PingCAP Docs:leftwards_arrow_with_hook::leftwards_arrow_with_hook:2:leftwards_arrow_with_hook:3:leftwards_arrow_with_hook:4:leftwards_arrow_with_hook:5:leftwards_arrow_with_hook:6
  2. Dev Guide: Schema Design Overview | PingCAP Docs:leftwards_arrow_with_hook::leftwards_arrow_with_hook:2:leftwards_arrow_with_hook:3
  3. Indexing and Constraints | PingCAP Docs:leftwards_arrow_with_hook::leftwards_arrow_with_hook:2:leftwards_arrow_with_hook:3
  4. Database | PingCAP Docs:leftwards_arrow_with_hook::leftwards_arrow_with_hook:2
  5. Other supported logical objects | PingCAP Docs:leftwards_arrow_with_hook:
  6. TiDB Introduction | PingCAP Docs:leftwards_arrow_with_hook:
  7. SQL Statements | PingCAP Docs

@ [yg_1988]
您这里提到了TTL的概念,我理解@大漠孤烟 的想法是想结合分区表来使用,这样按天切割为分区表,然后直接进行分区的drop或truncate。
我理解tidb TTL适用的是delete操作,不涉及truncate partition这样的DDL行为。包含他的参数设置上,也使用了delete的关键字:
show global variables like ‘%ttl%’;
±----------------------------------------±------------+
| Variable_name | Value |
±----------------------------------------±------------+
| log_throttle_queries_not_using_indexes | 0 |
| tidb_mpp_store_fail_ttl | 60s |
| tidb_ttl_delete_batch_size | 100 |
| tidb_ttl_delete_rate_limit | 0 |
| tidb_ttl_delete_worker_count | 4 |
| tidb_ttl_job_enable | ON |
| tidb_ttl_job_run_interval | 10m0s |
| tidb_ttl_job_schedule_window_end_time | 23:59 +0000 |
| tidb_ttl_job_schedule_window_start_time | 00:00 +0000 |
| tidb_ttl_scan_batch_size | 500 |
| tidb_ttl_scan_worker_count | 4 |
±----------------------------------------±------------+
我在官网没有找到关于partition使用TTL的特殊的描述,如果有查看到源码,有特殊的注释的,也请纠正我。

在使用DM迁移数据的时候,可以将分片的表合并到一个表,这种情况下,TIDB表类似于逻辑表。 其他情况,不是基于分片的,也就没有逻辑表的概念了。

两个数据库集群,cdc同步合并到一个表可以满足需求

可能我说的不太清楚,说明一下:
1、就是一个集群,不存在多个集群
2、表做切割,是类似mysql那种存储过程,自动的定期做切割(我们现在是每天晚上0点,将老表改为tablename_yymmdd,同时生成新表tablename)
3、定期删除n天前的老表。
4、现在我们希望在查询数据的时候,不用关心表名,都一直使用表名为:tablename的表进行查询(以前mysql的时候,单表查询已经很慢)

数据库应该没有这么个性化的设置。
从应用端来处理,应该会比较方便灵活,还能考虑多种处理方法。例如应用端去定期触发一个定时任务,批量新增分区,分区的时间可按照您的需求而定;另外再定义一个定时任务,去drop/truncate分区。
应用在访问时,都是按照表名来访问,只要筛选条件满足分区剪裁的要求即可。

可以动态调整。

从楼主的描述上看,创建日期分表的目的是为了控制当期表的大小(提升查询、写入性能),再有是方便数据清理。
如果索引和sql逻辑合理的话,对于tidb不用再创建分表tablename_yymmdd了,tidb的大表本身就会打散为region存储,访问性能可控,我们这边生产里有5tb以上的热点表(全部节点都是物理机+nvme ssd)。
如果当期表用于日结计算,计算前必须要求数据是清空状态的话,可以考虑使用import into命令(这个命令放在程序端就可以调用)向bak表里插入数据。

分区表?好像pg有什么父表子表的概念,但其实也是分区表

逻辑表不是数据库中间件的结果集吗?

1 个赞

没有的

楼主的描述中使用的都是物理表。
这个逻辑表的描述 更像分区表(时间-每天、每月)

没有逻辑表,你是要分区表吧?

分区表,暂时还不支持动态创建分区,删除表分区有特定的语法删除指定分区。应该可以实现你现在想要的。

我是想删除N天前的数据,怎么删除呢?全表扫描检查某个时间字段?

truncate或者drop想清理的分区表就可以

清理分区?

alter table table_name drop/truncate partition partition_name,这样的。

1 个赞

好的,谢谢,我先学习一下分区

业务代码自己封这个逻辑。