一、库表结构设计
TiDB不支持的数据对象:Function、Procedure、Trigger
Schema的KV映射原理:数据在RocksDB中以KV方式存储
表编号+主键 作为key,其他列 作为value
非聚簇表: key:TableID_RowID Value:所有列组成
聚簇表: key:TableID_Col1 Value:Col1之外的列组成
特点:
- 表中的行数据存储顺序与主键存储的顺序一致
- 主键是KV映射中key的一部分
- 通过主键访问行记录时,可直接获取行记录
clustered nonclustered
建表后只支持添加、删除非聚簇索引,不支持添加或删除聚簇索引
聚簇索引表和索引组织表类似
为避免写入热点,创建非聚簇表添加参数SHARD_ROW_ID_BITS、PRE_SPLIT_REGIONS
分区表
类型:range、list、list columns、hash
分区表的每个唯一键或主键,必须包含分区表达式中用到的所有列
自增列
持续大量插入数据,会导致数据写入到同一个region,导致单个节点压力过大。解决办法:建表时主键上加auto_random,必须为bigint类型,auto_random应用在聚簇表中,不支持alter table修改auto_random属性。
实现原理:每个TiDB节点会缓存一个不重复的ID段
单行大小限制为6MB
设计建议:
高兼容
- 适用从原来MySQL业务迁移到TiDB数据库
- 创建表时创建非聚簇表nonclustered
- 其他列保持原有设计
- 为表添加shard_row_id_bits和pre_split_regions
高性能
- 新建表使用聚簇表
- 准确选择数据类型
- 避免创建无效索引
- 主键用随机性强的列,设置auto_random
二、索引设计
唯一索引,非聚簇表的主键
key:tableid_indexid_indexcolvalue
value:rowid
二级索引(非唯一索引)
key:tableid_indexid_indexcolvalue_rowid
value:null
表达式索引:lower,md5,reverse,upper,vitess_hash
不可见索引 invisible(不会被查询优化器使用,使用hint语法也无法强制使用不可见索引),修改为可见visible。主键无法设置为不可见索引
查看索引分布 show table t1 index idx_t1 regions
三、系统表使用
mysql.user, information_schema, metrics_schema(tidb监控),performance_schema
mysql库user、db、tables_priv、columns_priv
mysql.tidb 修改相关参数
information_schema.cluster_info
information_schema.cluster_config
information_schema.ddl_jobs
information_schema.slow_query 可根据digest查出此类慢SQL
information_schema.tidb_hot_regions 查询读写热点
data_lock_waits 正在发生的悲观锁
deadlocks 默认可查询最近10次的死锁
tidb_trx 正在执行的事务信息