• 使用InnoDB存储引擎
      因为InnoDB 支持完整的事务,拥有行级锁,并发性能高
    • 使用utf8mb4字符集
      拥有utf8能力,并且兼容emoji字符。
    • 数据表,数据字段添加注释
    • 禁止使用存储过程、视图、触发器、Event
      高并发场景下,数据库只需要处理好数据读写和存储就好了,计算什么的交给上层业务去做。
    • 禁止存储大文件或者大照片。
      文件照片使用文件存储,数据库中只存储url
    • 建议使用自增主键
      数字型,占用空间小。系统自增,处理速度快。
    • 不使用外键
      外键会增加表耦合,还会导致sql性能降低。
    • 字段定义为Not null,并设定默认值
      null 字段会使用额外的空间。索引中需要对null进行额外处理,null只能用 is null 和 is not null处理。 !=无法处理null
    • 不使用Text 和 Blob
      大字段会浪费大量空间,在加载到内存缓存时也会占用大量空间。
    • 不使用小数存储价格
      float的底层存储会导致计算不准确
    • 手机号使用 varchar(20)
      因为手机号会带有区号字符等 比如 +86
    • 不使用 ENUM ,使用tinyint替代。
      enum底层也是tinyint,而且增加值需要修改表结构。
    • 单表索引建议不超过5个
    • 更新频繁,区分度不高的字段不建索引
      更新频繁会导致索引更新频繁,降低性能
      区分度不高的字段比如性别,索引的效率和filter并么有差多少。
    • 建立组合索引时,区分度高的字段放在前面
    • 不要使用 select *
    • 禁止使用属性隐式转换
      比如 SELECT uid FROM t_user WHERE phone=13800000000 会导致全表扫描。phone是varchar类型的,被隐式转换为数字类型,可能会导致索引失效。
    • 禁止在WHERE条件的属性上使用函数或者表达式
      SELECT uid FROM t_user WHERE from_unixtime(day)>=’2017-01-15’ 会导致全表。扫描正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp(‘2017-01-15 00:00:00’)
    • 禁止负向查询,以及%开头的模糊查询
      负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描
      %开头的模糊查询,会导致全表扫描
    • 禁止使用JOIN查询,禁止大表使用子查询
      会产生临时表,消耗较多内存与CPU,极大影响数据库性能
    • 禁止使用OR条件,必须改为IN查询
      旧版本Mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢?
    • 应用程序必须捕获SQL异常,并有相应处理