數據庫測試三部曲——兼容性

前言

衆所周知,互聯網業務的迭代,歸根結底是數據存儲及其消費方式的改變,這就涉及數據的落地及查詢,其中數據庫操作就是尤爲高效的一種方式。那如何在業務的高速迭代中,保證數據庫語句的兼容性呢?

語句構成

數據庫語句通常意義上分爲三類,分別爲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語句轉義前後導致的差異性。

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