来自tidb.ai
在TiDB中,逻辑表(logical table)是指数据库中用于存储和组织数据的基本结构单元。以下是关于TiDB逻辑表的一些关键信息:
- 定义:
- 逻辑表是TiDB集群中的一个逻辑对象,从属于数据库1。
- 它用于存储从SQL语句发送的数据1。
- 结构:
- 表由行和列组成1。
- 每一行代表一条数据记录,每一列代表一个特定的字段或属性1。
- 一个表至少要有一列1。
- 如果定义了n列,那么每一行数据都有相同的n个字段1。
- 数据类型:
- 每一列只允许一种数据类型2。
- 可以通过添加约束来进一步限定列的属性2。
- 性能优化:
- 可以添加生成列来加速计算2。
- 可以创建索引来提高查询性能3。
- 与其他对象的关系:
- 表是数据库中的一个对象,与索引等其他对象一起构成数据库4。
- TiDB还支持与表处于同一级别的其他逻辑对象,如视图、序列和临时表5。
- 特点:
- TiDB的表结构与MySQL兼容,使用MySQL兼容的语法6。
- 支持主键和二级索引3。
- 主键的定义与InnoDB(MySQL的常用存储引擎)有所不同3。
- 创建和管理:
- 可以使用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
- Dev Guide: Create Table | PingCAP Docs23456
- Dev Guide: Schema Design Overview | PingCAP Docs23
- Indexing and Constraints | PingCAP Docs23
- Database | PingCAP Docs2
- Other supported logical objects | PingCAP Docs
- TiDB Introduction | PingCAP Docs
- 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的特殊的描述,如果有查看到源码,有特殊的注释的,也请纠正我。
懒云一笑
23
在使用DM迁移数据的时候,可以将分片的表合并到一个表,这种情况下,TIDB表类似于逻辑表。 其他情况,不是基于分片的,也就没有逻辑表的概念了。
diwing
(Ti D Ber R Qstj35v)
24
两个数据库集群,cdc同步合并到一个表可以满足需求
大漠孤烟
(Ti D Ber Gj Skl5n G)
25
可能我说的不太清楚,说明一下:
1、就是一个集群,不存在多个集群
2、表做切割,是类似mysql那种存储过程,自动的定期做切割(我们现在是每天晚上0点,将老表改为tablename_yymmdd,同时生成新表tablename)
3、定期删除n天前的老表。
4、现在我们希望在查询数据的时候,不用关心表名,都一直使用表名为:tablename的表进行查询(以前mysql的时候,单表查询已经很慢)
数据库应该没有这么个性化的设置。
从应用端来处理,应该会比较方便灵活,还能考虑多种处理方法。例如应用端去定期触发一个定时任务,批量新增分区,分区的时间可按照您的需求而定;另外再定义一个定时任务,去drop/truncate分区。
应用在访问时,都是按照表名来访问,只要筛选条件满足分区剪裁的要求即可。
yg_2024
(yangguang)
28
从楼主的描述上看,创建日期分表的目的是为了控制当期表的大小(提升查询、写入性能),再有是方便数据清理。
如果索引和sql逻辑合理的话,对于tidb不用再创建分表tablename_yymmdd了,tidb的大表本身就会打散为region存储,访问性能可控,我们这边生产里有5tb以上的热点表(全部节点都是物理机+nvme ssd)。
如果当期表用于日结计算,计算前必须要求数据是清空状态的话,可以考虑使用import into命令(这个命令放在程序端就可以调用)向bak表里插入数据。
分区表?好像pg有什么父表子表的概念,但其实也是分区表
楼主的描述中使用的都是物理表。
这个逻辑表的描述 更像分区表(时间-每天、每月)
分区表,暂时还不支持动态创建分区,删除表分区有特定的语法删除指定分区。应该可以实现你现在想要的。
大漠孤烟
(Ti D Ber Gj Skl5n G)
35
我是想删除N天前的数据,怎么删除呢?全表扫描检查某个时间字段?
alter table table_name drop/truncate partition partition_name,这样的。
1 个赞