1) 表存储引擎必须使用InnoDB
2) 表字符集utf8mb4
3) 禁止使用存储过程,视图,触发器,Event
4) 禁止在线上环境做数据库压力测试
1) 库名,表名,列名 必须见名知义.所有库名、表名、字段名、枚举名 全部用小写字母,单词之间用下划线_分隔。
2) 表的命名: 推荐以'业务名称_具体表名'为模板,如具体表名含义复杂,在具体表名后再增加含义如:'模块名称_具体表名_xxxxx'。例如'project_approval'表名。
3) 字段命名
* 对于本模型字段, 例如 `order`表中的订单编号, 推荐使用`item_no`, 而不是`order_item_no`.
* 对于非本模型字段, 例如 `payment`表中的订单编号, 推荐使用`order_item_no`,而不是`item_no`
1) 每个表必须建立主键
2) 禁止使用外键
3) 根据业务区分使用char/varchar
4) 每个表中必需要有 create_at
(插入时间) 和 update_at
(更新时间)字段,
* create_at 使用datatime, 语法: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
* update_at 使用datatime ,语法: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间'
如果涉及操作人/更新人, 统一使用 create_user_id
,create_user_name
, update_user_id
, update_user_name
5) 新建字段必须为NOT NULL,并设默认值为非null值
6) 字段类型长度应设置为保证正常使用需求下的最小长度。
7) 禁止删除列
8) 合理使用字段冗余, 禁止过分冗余.
9) 合理设计表的水平拆分, 禁止过分拆分.
10) 对于命名简单的字段, 可以不写注释. 对于命名复杂或难以理解的字段, 应该添加注释. enum字段必须添加注释.对应的代码中应该使用Enum或静态常量.
1) 唯一索引使用uniqe_[字段名]来命名,eg:unique_asset_item_no
2) 非唯一索引使用idx_[字段名]来命名,eg:idx_asset_create_at
3) 单张表索引数量建议控制在5个以内
4) 对于大表,至少在一个时间字段上建立index.
5) 不建议在频繁更新的字段上建立索引(eg:尽量避免在update_at上建立index)
6) 非必要不要进行JOIN查询,如果要进行JOIN查询,被JOIN的字段必须类型相同,并建立索引
7) 理解组合索引最左前缀原则,避免重复建设索引,index(part1,part2,part3),相当于建立了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引.
1) 禁止使用select *
2) insert必须指定字段,禁止使用insert into T values()
3) 隐式类型转换会使索引失效,导致全表扫描(select uid from user where phone=13811223344 --phone varchar(20) 为什么不能命中phone字段index)
4) 禁止在where条件列使用函数或者表达式 (select uid from where date(user_create_at)='2018-01-01' -- 为什么不能命中user_create_at index)
5) 同一个字段上的OR必须改为 IN,IN的值必须少于50个
6) 禁止 drop table/database/column ,truncate table
使用mysql explain 对sql执行效率进行检测
1)使用方法:在select语句前加上explain即可 。
2)explain 分析结果形式如下: table | type | possible_keys | key | key_len | ref | rows | Extra explain 分析结果形式中各属性含义: table :显示这一行的数据是关于哪张表的 type :这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL 。
possible_keys :显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句。
key :实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引。
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好。
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。
rows:MYSQL认为必须检查的用来返回请求数据的行数。
Extra :返回的描述的意义。
sku_id
, 不得冗余sku
polarDB数据一致性说明 https://help.aliyun.com/document_detail/99093.html?spm=a2c4g.11186623.6.639.36d66fb6V0UroR#title-ijd-kdt-8hk 我们当前使用会话一致性. 如果在写入数据库, 希望马上读取到, 需要保证这两个操作在同一个会话中, 即开启事务.