GBase 8a
运维管理
文章

GBase 8a 数据类型选型指南,选错类型查询慢10倍

发表于2026-03-19 10:03:1833次浏览4个评论

在建表时选对数据类型,是保证 GBase 8a 查询性能的第一步。很多性能问题的根源不在 SQL,而在建表时就埋下了隐患。

一、数值类型

GBase 8a 支持以下常用数值类型:

  1. TINYINT:占1字节,范围 -128~127,适合存状态码、标志位等小整数
  2. INT / INTEGER:占4字节,范围约 -21亿~21亿,适合存普通 ID、数量
  3. BIGINT:占8字节,适合存雪花算法生成的分布式 ID、大流水号
  4. DECIMAL(M,D):精确小数,适合存金额、价格,避免浮点精度问题
  5. FLOAT / DOUBLE:近似小数,有精度误差,不适合金融场景

注意事项:

  1. 金额字段一定用 DECIMAL,不要用 FLOAT,否则会出现 0.1+0.2≠0.3 的精度问题
  2. 状态、类型等字段尽量用 TINYINT,不要用 VARCHAR 存 "active"/"inactive" 这类字符串,列存储下数值压缩效果远优于字符串
  3. 自增主键推荐用 BIGINT,INT 的21亿上限在大数据场景下很容易打满

二、字符串类型

  1. CHAR(N):固定长度,不足则补空格,适合存长度固定的字段如身份证号、手机号
  2. VARCHAR(N):可变长度,适合存长度不固定的字符串
  3. TEXT / LONGTEXT:存大文本,不参与列存储压缩,查询性能较差

注意事项:

  1. 能用 CHAR 就不要用 VARCHAR,固定长度字段在列存储中压缩效果更好
  2. 不要在 TEXT 类型字段上做 WHERE 过滤,会触发全表扫描
  3. VARCHAR 的长度声明不要无脑写 VARCHAR(255),按实际最大长度设置,过大的长度声明会影响内存估算

三、时间类型

  1. DATE:只存日期(年月日),占3字节
  2. DATETIME:存日期+时间,精确到秒,占8字节
  3. TIMESTAMP:存时间戳,自动转换时区,范围到2038年
  4. INT 存时间戳:部分系统用 INT 存 Unix 时间戳,范围同样受2038年限制

注意事项:

  1. 有时区需求的场景用 TIMESTAMP,没有时区需求用 DATETIME
  2. 分区键如果是时间类型,推荐用 DATE 或 DATETIME,不推荐用 INT 时间戳,范围分区写法更直观
  3. 不要用字符串存时间(如 VARCHAR 存 "2024-01-01"),无法利用粗糙索引的范围过滤

评论

登录后才可以发表评论
GBase用户14332发表于 4个月前
学习了
经纬发表于 4个月前
学习了
ljt98发表于 2个月前
谢谢分享
GBase用户47954发表于 1个月前
感谢作者的精彩分享!