一、表设计原则之表定义

181 阅读2分钟

每增加一个 where 或者 order by 条件时,确认一下是否有相应的索引定义,尽可能利用最左匹配原则重用索引,减少索引的个数。

1. 表定义

(1) 尽可能做到单表查询,通过必要的字段冗余减少表关联的可能;

(2) 常用字段与大字段应拆分到不同表,例如:帖子内容应存到单独的表;

2. 主键设计

(1) 每个表都必须定义主键;

(2) 选择无业务含义的字段作为主键,以免业务数据订正时影响到引用该记录的其他表数据;

(3) 自增类型的主键可以满足大部分场景的需求,并且表数据与索引数据占用空间较小,批量顺序插入性能更好;

(4) 需要分库分表的表主键可采用 UUID,避免表数据合并时发生主键冲突;

注:GUID 类通过压缩编码将 40 位 UUID 减少到 26 位,推荐使用。

(5) 如果将自增主键暴露在外存在安全风险,例如竞争对手可通过每日订单ID 的增量估算我们的业务规模,则订单主键宜采用 UUID;


自增字段必须是表的物理主键,一般情况下,我们也将它作为表的逻辑主键。但在特殊场景下,我们可以将自增字段当作一个自维护的排序字段,然后新增一个UUID 字段作为表的逻辑主键。例如:IndexCommand 表利用自增的sequence字段自动记录索引任务的先后顺序,而逻辑上的主键字段id是一个Java程序创建的UUID值。


3. 字段定义

(1) 数字类型比字符串类型占用空间小,查询速度更快;

(2) 字段长度够用就好;

(3) 数字类型字段一般定义为 not null,避免统计时编写 sum(ifnull(f1,0))这样的复杂语句;


  • [ 萱儿AXW ]