前言
众所周知,互联网业务的迭代,归根结底是数据存储及其消费方式的改变,这就涉及数据的落地及查询,其中数据库操作就是尤为高效的一种方式。那如何在业务的高速迭代中,保证数据库语句的兼容性呢?
语句构成
数据库语句通常意义上分为三类,分别为DDL、DML和DCL。
- DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create、drop、alter等。
- DML(Data Manipulation Languages)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括insert、delete、update和select等。
- DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,主要的语句关键字包括grant、revoke等。
以上列举了常见的三类SQL语句,由于DCL语句一般为DBA的常用操作,开发及测试涉及较少,下面就从DDL、DML和其他方面看一下兼容性需要如何考虑。
关注点
一、DDL
DDL兼容性主要是为了防止由于表结构的变化而引起的SQL执行报错,重点关注以下几点:
- 字段只能增加而不建议删除
- 字段长度只能变大而不建议减小,且字段长度不建议过大
- 字段名字不建议修改
- 字段类型不建议修改
- 如果字段需要进行比较,尽量不要采用nvarchar或varchar类型
- 表不建议删除
- 表名不建议修改
二、DML
DML兼容性主要关注以下几点:
- insert语句需要指定具体的列
- insert语句对应字段明确指定默认值,防止Null导致的不确定性
- 字段变更含义只能扩充而不能修改和缩减,如果需要修改和缩减,建议用新字段代替
- select语句需要指定具体的列,禁止用 select *
- select语句仅需要一条数据时,使用limit 1
- 如果排序字段没有用到索引,请尽量少排序
- 查询尽量用union all代替union
union和union all的差异主要是前者需要将结果集合并后并进行唯一性过滤操作,这就涉及排序,增加大量的cpu运算,加大资源消耗及延迟。当然union all的前提是两个结果集没有重复数据。 - 使用合理的分页方式以提高分页效率
select id,name from product limit 866613, 20
使用上述SQL语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。
优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此列中,上一页最大的id是866612。SQL可以采用如下的写法:
select id,name from product where id> 866612 limit 20
- 避免在where子句中对字段进行null值判断,会使引擎放弃使用索引
- 避免在where子句中对字段进行表达式操作,会使引擎放弃使用索引
三、其他
实际软件开发中会通过mybatis或hibernate等第三方框架对数据库进行操作,所以还需要考虑第三方框架对sql语句转义前后导致的差异性。