1 设计规范详情mysql
1.1 基本命名和约束规范sql
1.1.1 统一表字符集为UTF8,若是须要存储emoj表情,须要使用UTF8mb4(mysql5.5.3之后才支持)数据库
1.1.2 存储引擎采用InnoDB函数
1.1.3 变长字符串尽可能使用varchar varbinary优化
1.1.4 不在数据库中存储图片、文件等设计
1.1.5 单表数据量控制在1亿如下索引
1.1.6 库名、表名、字段名不使用保留字图片
1.1.7 库名、表名、字段名、索引名使用小写字母,如下划线分割 ,须要见名知意字符串
1.1.8 表名不宜设计过长,尽量用最少的字符表达出表的用途数学
1.2 字段设计规范
1.2.1 全部字段均定义为NOT NULL
1.2.2 字段类型在知足需求条件下越小越好,使用UNSIGNED存储非负整数 ,实际使用时候存储负数场景很少
1.2.3 使用datatime类型存储时间
1.2.4 使用varchar类型存储变长字符串 ,固然要注意varchar(M)里的M指的是字符数不是字节数;使用UNSIGNED INT存储IPv4 地址而不是CHAR(15) ,这种方式只能存储IPv4,存储不了IPv6
1.2.5 使用DECIMAL存储精确浮点数,用float有的时候会有问题
1.2.6 尽可能少用blob或text类型
1.3 索引设计规范
1.3.1 单个索引字段数不超过5,单表索引数量不超过5,索引设计遵循B+ Tree索引最左前缀匹配原则
1.3.2 选择区分度高的列做为索引
1.3.3 创建的索引能覆盖80%主要的查询,不求全,解决问题的主要矛盾
1.3.4 DML和order by和group by字段要创建合适的索引
1.3.5 避免索引的隐式转换和避免冗余索引
1.4 SQL设计规范
1.4.1 尽可能不使用存储过程、触发器、函数等
1.4.2 避免使用大表的JOIN,MySQL优化器对join优化策略过于简单
1.4.3 避免在数据库中进行数学运算和其余大量计算任务
1.4.4 SQL合并,主要是指的DML时候多个value合并,减小和数据库交互
1.4.5 合理的分页,尤为大分页
1.4.6 UPDATE、DELETE语句不使用LIMIT ,容易形成主从不一致
1.5 补充说明
1.5.1 表字段为何定义不使用Null
1.5.1.1 浪费存储空间,由于InnoDB须要有额外一个字节存储
1.5.1.2 表内默认值Null过多会影响优化器选择执行计划
1.5.2 关于使用datatime和timestamp
1.5.2.1 如今在5.6.4以后又有了变化,使用两者存储在存储空间上大差距愈来愈小 ,而且自己datatime存储范围就比timestamp大不少,timestamp只能存储到2038年