- 使用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异常,并有相应处理
