继续唠叨...
mysql数据库、表、索引命名规则
- snake样式,复数,activerecord也是这样默认命名
- 不使用关键字,实际使用中很多关键字被用作了字段名,如 desc key
- 库名、表名、字段名不超过15个字符,实践中表名超15个字符是很正常的,特别是在同一个数据库按多种业务分表的情况下,毕竟
要使用表名将其业务逻辑表述清楚不易。
- mysql数据库、表、字段名字的最大长度没有测试,看了一篇帖子说数据库与数据表名字最长为64字节(没有考证,感觉用不到那么长...),
再就是过长的命名对性能是否有影响不确定。
*索引命名 聚集索引:cxtablenamecolumn 一般索引: ixtablenamecolumn 唯一索引:uxtablenamecolumn
字段类规范
- 所有字段均定义为NOT NULL,增加列的时候设置为null,不要有默认值,不然遇到大表会很闹心
- 字符串统一单引号引用,而不是双引号,mysql竟然可以使用双引号...sql server字符串只能用单引号
- 使用UNSIGNED存储非负整数
- 使用DECIMAL存储精确浮点数,一般用来存金额
- 使用TINYINT来代替ENUM类型,使用tinyint的时候要小心,字段含义一旦扩充,tinyint可能就不够存了
- 拆分TEXT、BLOB类型字段,未实际操作过
- 使用UNSIGNED INT存储ipv4 地址,why?
- 非中文字段使用varchar存储变长字符串,why?
- 尽可能将字符转化为数字 存储
- 使用TIMESTAMP存储操作时间,activerecord默认updated_at类型为datetime
索引类规范
- 单张表索引数量不超过5,单个索引字段数不超过5,没有实际测试过,5这个数字实践结果?
- 重要的SQL必须被索引
- UPDATE、DELETE语句的WHERE条件列
- ORDER BY、GROUP BY、DISTINCT的字段
- 多表JOIN的字段
- 主键的选择要慎重,首选使用非空的唯一键, 其次选择自增列或发号器,现一般使用自增列,不使用更新频繁的列,尽量不选择字符串列,不使用UUID MD5 HASH
- 在必要的情况下再加索引
- 不在null列上加索引?
- 不在低基数列上建立索引,例如“性别”
- 复合索引字段排序,区分度最大的字段放在前面
- 对特殊字段,增加crc32或md5的伪列并建立索引
- 核心SQL优先考虑覆盖索引
- 对字符串使用前缀索引
- 前缀长度不超过8个字符
- 必须是最左前缀
- 针对索引的禁忌
- 不使用负向查询,例如 not in,!= ,not like
- 不在索引列进行数学运算和函数运算
- 不使用%前导的查询,例如like “%abc”