数据库测试三部曲——兼容性

前言

众所周知,互联网业务的迭代,归根结底是数据存储及其消费方式的改变,这就涉及数据的落地及查询,其中数据库操作就是尤为高效的一种方式。那如何在业务的高速迭代中,保证数据库语句的兼容性呢?

语句构成

数据库语句通常意义上分为三类,分别为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执行报错,重点关注以下几点:

  1. 字段只能增加而不建议删除
  2. 字段长度只能变大而不建议减小,且字段长度不建议过大
  3. 字段名字不建议修改
  4. 字段类型不建议修改
  5. 如果字段需要进行比较,尽量不要采用nvarchar或varchar类型
  6. 表不建议删除
  7. 表名不建议修改
二、DML

DML兼容性主要关注以下几点:

  1. insert语句需要指定具体的列
  2. insert语句对应字段明确指定默认值,防止Null导致的不确定性
  3. 字段变更含义只能扩充而不能修改和缩减,如果需要修改和缩减,建议用新字段代替
  4. select语句需要指定具体的列,禁止用 select *
  5. select语句仅需要一条数据时,使用limit 1
  6. 如果排序字段没有用到索引,请尽量少排序
  7. 查询尽量用union all代替union
    union和union all的差异主要是前者需要将结果集合并后并进行唯一性过滤操作,这就涉及排序,增加大量的cpu运算,加大资源消耗及延迟。当然union all的前提是两个结果集没有重复数据。
  8. 使用合理的分页方式以提高分页效率
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
  1. 避免在where子句中对字段进行null值判断,会使引擎放弃使用索引
  2. 避免在where子句中对字段进行表达式操作,会使引擎放弃使用索引

三、其他

实际软件开发中会通过mybatis或hibernate等第三方框架对数据库进行操作,所以还需要考虑第三方框架对sql语句转义前后导致的差异性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章