建表
-
每個表主鍵都叫id。
-
每個表都需要以下五個字段:
idbigint(20) unsigned NOT NULL COMMENT '主鍵id',create_timedatetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',update_timedatetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',version_reordint(11) NOT NULL DEFAULT 0 COMMENT '樂觀鎖版本,不斷遞增',is_deletedtinyint(1) NOT NULL DEFAULT 0 COMMENT '0:表示未刪除,1:表示已刪除',(is_deleted有唯一索引字段的表可以不用這個字段) -
每個字段都要有comment的說明。
-
所有字段都要設置not null default。
-
所有字段加起來占的空間要盡量小,表盡量不要出現大字段,不常用的字段可以分另一個id相同的關聯表存儲。
-
盡量用復合索引替代多個單列索引,并且大表盡量做到覆蓋索引的查詢。
-
表外鍵對應其他表的id字段。
-
要考慮歷史數據的遷移和存儲。
新增
-
主鍵使用【自主生成】的自增的long值。
更新
-
更新操作最好where條件是能夠走到索引的。具體參照【索引使用規范】
刪除
-
線上業務數據禁止物理刪除(關聯表除外比如:角色和人員關聯這種),需要有刪除功能的可以用is_deleted邏輯刪除。
查詢
-
頁面查詢接口禁止提供直接跳最后一頁和隨意輸入頁碼的方式。
-
對照【索引使用規范】設置語句,避免高頻查詢語句慢查詢。
-
篩選字段傳入值的類型要和數據庫類型相匹配。
-
查詢一定要帶上limit語句,大表可以分批查詢。
索引使用規范
-
查詢的時候字段類型要和表類型一致.
-
where語句要有一個命中最左索引列的篩選字段才能命中索引.
-
單列、多列聯合索引中最左列索引值區分度不大的時候也很大概率不會使用到索引,比如性別字段.
-
like 只有前綴匹配才能用到索引,比如:xxx%。
-
查詢的時候如果select、where、order by等篩選項里面的字段都在索引中,并且命中最左索引的話,則可以用到覆蓋索引,減少查詢時間。
-
order by 語句要有一個命中最左索引列的篩選字段才能命中索引,并且多字段排序的時候,如果字段都在索引里面,要排序方式都一致才能排序的時候使用索引。
-
orderby如果前面篩選行數太多的時候也會觸發filesort,所以要配合limit語句使用。
-
盡量使用主鍵索引和唯一索引進行crud操作。