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事务隔离级别