SQL编写规范
一、表设计规范
- StoneDB的表无需创建索引,但主键是关系型数据库中唯一确定一条记录的依据,建议给表定义主键。
- 使用自增类型主键,严禁使用uuid类型主键,自增主键能有效提高插入的性能,避免过多的数据页分裂和碎片的增加,提高了空间的使用率,而uuid类型 主键不仅无序,而且占用空间更大。
- 严禁使用外键约束,有外键的表在每次插入、更新和删除后,需要进行完整性的检查,额外的检查工作对性能来说是有损的。
- 定长字符型字段使用CHAR类型,不定长字符型字段使用VARCHAR类型。
- 合理定义字段长度,若实际存储长度与定义长度差异过大,不仅占用空间,而且影响访问效率。
- 字段尽量定义为NOT NULL,并且提供默认值。
- 表中应包含时间戳的字段,时间戳是获取增量数据的一种方法,可预估一个时间范围内的行数,也可更方便的进行数据清理和归档。
- 字段尽量不使用大对象类型,如果查询出现大对象类型的字段,就会消耗大量的网络和IO带宽,如有需要,可考虑在外部进行存储。
- 无论是表名还是字段名,都不能使用数据库的关键字,如desc、order、group、distinct等。
- 无论是表还是字段,字符集建议一致。
- 无论是表还是字段,有必要加入注释,有注释更易于维护和易读。
二、SQL编写规范
2.1 避免select *
查询尽量用确定的字段名,不因图方便用*来代替,理由:
-
将不需要的字段从服务端传输到客户端,额外增加了网络开销;
-
影响SQL的执行计划,例如:用select *进行查询时,很可能不会使用到覆盖索引,就会造成回表查询。
反例:
select * from test;
正例:
select id,name from test;
2.2 避免在where
子句中使用or
多个字段进行or查询时,建议用union all联结,分成多次查询。
理由:使用or可能会导致索引失效
反例:
select * from test where group_id='40' or user_id='uOrzp9ojhfgqcwRCiume';
正例:
select * from test where group_id='40'
union all
select * from test where user_id='uOrzp9ojhfgqcwRCiume';