GBase 8a
运维管理
文章
GBase 8a 数据类型选型指南,选错类型查询慢10倍
发表于2026-03-19 10:03:1833次浏览4个评论
在建表时选对数据类型,是保证 GBase 8a 查询性能的第一步。很多性能问题的根源不在 SQL,而在建表时就埋下了隐患。
一、数值类型
GBase 8a 支持以下常用数值类型:
- TINYINT:占1字节,范围 -128~127,适合存状态码、标志位等小整数
- INT / INTEGER:占4字节,范围约 -21亿~21亿,适合存普通 ID、数量
- BIGINT:占8字节,适合存雪花算法生成的分布式 ID、大流水号
- DECIMAL(M,D):精确小数,适合存金额、价格,避免浮点精度问题
- FLOAT / DOUBLE:近似小数,有精度误差,不适合金融场景
注意事项:
- 金额字段一定用 DECIMAL,不要用 FLOAT,否则会出现 0.1+0.2≠0.3 的精度问题
- 状态、类型等字段尽量用 TINYINT,不要用 VARCHAR 存 "active"/"inactive" 这类字符串,列存储下数值压缩效果远优于字符串
- 自增主键推荐用 BIGINT,INT 的21亿上限在大数据场景下很容易打满
二、字符串类型
- CHAR(N):固定长度,不足则补空格,适合存长度固定的字段如身份证号、手机号
- VARCHAR(N):可变长度,适合存长度不固定的字符串
- TEXT / LONGTEXT:存大文本,不参与列存储压缩,查询性能较差
注意事项:
- 能用 CHAR 就不要用 VARCHAR,固定长度字段在列存储中压缩效果更好
- 不要在 TEXT 类型字段上做 WHERE 过滤,会触发全表扫描
- VARCHAR 的长度声明不要无脑写 VARCHAR(255),按实际最大长度设置,过大的长度声明会影响内存估算
三、时间类型
- DATE:只存日期(年月日),占3字节
- DATETIME:存日期+时间,精确到秒,占8字节
- TIMESTAMP:存时间戳,自动转换时区,范围到2038年
- INT 存时间戳:部分系统用 INT 存 Unix 时间戳,范围同样受2038年限制
注意事项:
- 有时区需求的场景用 TIMESTAMP,没有时区需求用 DATETIME
- 分区键如果是时间类型,推荐用 DATE 或 DATETIME,不推荐用 INT 时间戳,范围分区写法更直观
- 不要用字符串存时间(如 VARCHAR 存 "2024-01-01"),无法利用粗糙索引的范围过滤
评论
登录后才可以发表评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526