1.库命名规则:dbname_suffix,分为_dev/_test/_pre/_mertest/_perf/_prod六个环境函数
2.适度反范式设计,冗余表字段数据减小JOIN关联提升访问效率性能
3.普通索引命名:idx_字段名,联合索引命名:idx_字段名1_字段名2…,惟一索引命名:uq_字段名优化
4.表和字段必须加上(中文)注释设计
5.存储时间类型datetime/timestamp/date等,不使用char/varchar。【建议】建议当时间范围小于2037年使用TIMESTAMP类型,由于 TIMESTAMP占用空间更小unix
6.关键业务数据表,增长create_time和update_time字段,使用current_timestamp()函数定义默认值,方便后期数据分析和问题追溯索引
示例:资源
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间',数据分析
update_time timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'io
7.存储精确浮点数必须使用 DECIMAL 替代 FLOAT 和 DOUBLEtable
8.全部字段均显示定义为NOT NULL,不使用 DEFAULT NULL 并指定DEFAULT值
× aaa varchar(32) DEFAULT NULL
√ aaa varchar(32) NOT NULL DEFAULT ''
√ bbb int NOT NULL DEFAULT -1
9.char ,Varchar 长度适当,可预见范围内尽可能小
说明:varhcar(10) 中的数字不是字节而是字符,那么此处能存下10个汉字或字母。**
10.单表字段数量控制在50个之内,尽量不使用TEXT、BLOB 类型,将过大字段拆分到其余表中
11.支持建立新表和添加新字段,禁止drop和rename表名和字段名(支持应用上灰度发布)
12.UPDATE、DELETE 语句须要根据 WHERE 条件添加索引
13.对长度过长的 VARCHAR 字段创建索引时, 添加 crc32 或者 MD5 Hash 字段, 对 Hash 字段创建索引
14.禁止在更新频繁、区分度不高的字段上创建索引
15.JOIN字段要建立索引
16.单个索引字段数不超过5,最好使用惟一性好的索引,单表索引数量不超过5
17.ORDER BY,GROUP BY,DISTINCT 的字段须要添加在索引的后面,不然会很消耗io、cpu计算资源
18.SELECT 语句只输出须要的字段,禁止SELECT *
19.SELECT、INSERT 语句必须显式的指明字段名称,不使用 SELECT *,不使用 INSERT INTO table()
20.写密集场景INSERT 语句使用 batch 提交(INSERT INTO table VALUES(),(),()……) ,values 的个数不该过多,控制在1000个之内
21.避免大表与大表之间的JOIN,考虑让小表去驱动大表JOIN
SELECT * FROM table WHERE TIME<last_TIME ORDER BY TIME DESC LIMIT 10
SELECT * FROM table inner JOIN(SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t USING(id)
23.WHERE语句中使用IN代替OR ,但IN的值不超过1000,或改写成JOIN性能会更好
24.WHERE 条件中的非等值条件(IN、BETWEEN、<、<=、>、>=)会致使后面的条件使用不了索引
25.WHERE 条件中字段禁止运算禁止使用函数`× where id + 1 = 100
√ where id = 100 -1
× where unix_timestamp('time') = 1366169490
√ where time = FROM_UNIXTIME(1366169490) `
26.WHERE中禁止使用%前缀模糊查询,例如 LIKE “%abc”,会致使全表扫描