MySQL使用规范
条评论58MySQL规范
- 表存储引擎必须使用InnoDB
表字符集默认使用utf8,必要时使用utf8mb4(4个字节的utf8,能存储表情符号)
禁止使用存储过程、视图、触发器(扩展性差)
禁止在数据库中存储大文件,例如图片,大文件存储到分布式文件系统,数据库中保存访问地址
库名、表名、列名必须用小写,”_”分隔(MyBatis生成工具可自动转换为驼峰)
库名、表名、列名长度不要超过32个字符
表必须有主键,推荐使用unsigned整数为主键
禁止使用外键(外键影响性能,有可能造成死锁)
将大字段、访问频度低的字段拆分到单独的表中存储,分离冷热数据
根据业务区分使用tinyint/int/bigint分别占1/4/8字节
根据业务区分使用char/varchar(char查询性能高,varchar减少存储空间)
根据业务区分使用datetime/timestamp(我都使用datetime)
必须把字段定义为NOT NULL并设置默认值(NULL列使索引更复杂)
使用int unsigned存储IP4,不要使用char(15)
使用varchar(20)存储手机号码,不要使用整数(考虑+86,varchar支持模糊查询)
使用tinyint,不要使用enum
唯一索引使用uniq_命名
非唯一索引使用idx_命名
单表索引建议控制在5个以内(太多索引影响写性能,异常复杂的查询需求,可以选择ES等存储方式)
组合索引字段数不建议超过5个
不建议在频繁更新的字段上建立索引
除非必要不做join查询,join字段必须建立索引
禁止使用select *,只获取必要字段(表结构变更时,对程序无影响)
insert必须指定字段(表结构变更时,对程序无影响)
隐式类型转换会使索引失效
禁止在where条件中使用函数或表达式(索引失效)
禁止以%开头的模糊查询(索引失效)
同一个字段OR使用IN
赶集MySQL规范
控制列的数量,字段数控制在20个以内
避免使用NULL字段
不在数据库里存图片
不在索引列做运算
SQL语句尽可能简单
事务时间尽可能短
limit越大效率越低
阿里巴巴MySQL规范
互联网业务,能让服务层干的事情,不要交到数据库层。
删除无主键的表,如果是row模式的主从架构,从库会挂住。
TODO
如何实施数据库垂直拆分?
MySQL索引
MySQL索引失效
MySQL事务隔离级别