建表
-
每个表主键都叫id。
-
每个表都需要以下五个字段:
id
bigint(20) unsigned NOT NULL COMMENT '主键id',create_time
datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',update_time
datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',version_reord
int(11) NOT NULL DEFAULT 0 COMMENT '乐观锁版本,不断递增',is_deleted
tinyint(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操作。