資料庫注意事項

2021-08-18 23:34:48 字數 1806 閱讀 8230

主要就是6點:

1. 必須考慮業務唯一性並建復合唯一索引

2. 所有字段盡量設定為not null

3. 區分度低的字段不要建索引

4. 邏輯外來鍵要建索引

5. 用uuiddelete_id varchar(32) not null default ''做偽刪除

6. 建議確定無負數的字段設定unsigned

建表時必須考慮業務唯一性, 比如工單的目標上報sku表factory_mission_detail, 乙個工單只會且只能有一條記錄描述單個sku的目標數量, 這種情況下就應該給工單id(mission_id)和sku_id建立復合唯一索引, 並且要注意, 復合索引的順序很重要也很關鍵, 復合索引遵循左字首原則, 就是查詢的時候要資料庫用上這個復合索引, 在where後面的條件就必須從左往右寫, 比如上面的mission_id, sku_id的復合索引, 在查詢的時候就必須寫成where mission_id = '' and sku_id = '', 否則無法使用該索引. 還有一點是一般我們建復合索引都要考慮查詢需求, 比如我們一般會查工單下的sku情況, 而不會出現查某個sku的工單, 所以這個復合索引應該要建成mission_id, sku_id而不是sku_id, mission_id. 總結來說, 就是表達範圍大的放前面, 表達範圍小的放後面.

好處:

可以保證資料層面上不會出現重複資料, 是表單重複提交的最後一道屏障

提高查詢效率

設計欄位時盡量設定字段不能為null, 因為在mysql, null值會影響加在字段上的索引效率, 並且會有額外的空間占用, 並且會給應用程式帶來很多空指標風險. 具體使用分3種情況:

業務需求上要求不能為空並且指明有預設值, 比如狀態會有個預設狀態, 這種情況就設定為not null default '預設值'業務需求上要求不能為空並且沒有預設值, 這種情況表示沒有該欄位整條資料都沒有意義, 比如節點上報的節點id為空是沒有意義的, 直接設定為not null即可

業務需求上要求必須有空值表達邏輯, 盡量不要出現這種情況,varchar可以用空字串當預設值,int可以用0或者-1當預設值

索引不要隨便建, 區分度小的字段建索引是沒有意義的, 不能提高查詢效率還影響增刪改效率. 比如狀態值status, 理論上所有列舉欄位都不應該加索引.

一般需要join的字段(就是邏輯外來鍵)應該要建普通索引, 否則在join的時候會全表掃瞄

假刪除考慮唯一鍵問題, 使用乙個無意義的uuid欄位(delete_id varchar(32) not null default '')表示被刪除, 如果為空字串則表示改資料沒有被刪除, 否則表示被刪除. 這麼做的話就需要把該錶的所有唯一索引(注意是唯一索引)和該字段組成復合索引, 這裡要特別小心不要把delete_id建到其它唯一索引的前面, 一定要跟在後面, 比如第一條的mission_id, sku_id復合唯一索引加上delete_id之後必須是mission_id, sku_id, deleted_id.

最後一條建議, 在設定數值的時候如果業務上確定不會有負數, 建議設定為unsigned(無符號), 可以在占用相同空間的前提下可以加大正數範圍

資料庫注意事項

索引會佔據瓷盤空間,資料越大索引佔據空間越大 mysql表中除了聚集索引外其他索引都是輔助索引 secondary index,也稱為非聚集索引 與聚集索引的區別是 輔助索引的葉子節點不包含行記錄的全部資料。聚焦索引 更適合between and和order by操作,每個表只能建立乙個聚焦索引 如...

資料庫維護注意事項

壓縮日誌及資料庫檔案大小 特別注意 請按步驟進行,未進行前面的步驟,請不要做後面的步驟 否則可能損壞你的資料庫.一般不建議做第4,6兩步 第4步不安全,有可能損壞資料庫或丟失資料 第6步如果日誌達到上限,則以後的資料庫處理會失敗,在清理日誌後才能恢復.1.清空日誌 dump transaction ...

資料庫設計注意事項

關係型資料庫還能盛行多久?針對表的描述中,要重點說明設計這張表的原因 理由或目的,以及與其他表的關係,尤其是與業務邏輯緊密相關的表。指令碼中,每個字段新增必要的注釋,例如 comment on table sys users t is 系統使用者的相關資訊 comment on column sys...