MySQL开发规范与要求
1 表必须有主键
主键与业务无关,不要更新。
2 单表数据量不要超过千万行
2-1
单表数据太大,在数据库增加字段时候,
先建立一个新表,然后复制数据到新表,
再删除老表,重命名新表
数据量越大,越慢。
2-2
- 表越大,关联查询越慢
- 创建表的时候保留几个字段,比如bigint,varchar,预留2-3个
- 单表数据过大超过千万,可以考虑分库分表
3 禁止在系统的生产环境,执行DDL,包括加索引
- 1 可能会遇到data meta lock等问题
- 2 会锁表,影响业务,可能超时。
4 不要在数据库用存储过程,函数,触发器
数据库仅仅用例记录,不要参与复杂计算
建议将计算逻辑放到Java代码中
5 生产下,禁止大事务
比如,update更新全表,如果记录超过10万行,需要分批执行。
6 慎用子查询
- 尽量使用join关联表,避免子查询,子查询影响性能。
7 字段能用整型,一定不要varchar
- 整型的性能会好很多
8 不允许在表中大字段
比如:text,lob,blob,
如果存储的是文件,图片,仅仅保留地址
9 三范式
可以适当冗余
10 多表事务
同一事务多表更新,需要按照表的更新顺序更新,避免死锁
11 使用count(*)
使用count(*) 统计所有行,包括空行
使用count(列名),空行不会被统计到。
12 count(distinct(列名))
计算该列除空行之外,不重复的行数
13 count(distinct(列名1,列名2))
如果其中某一列都是空,另外一列有不同的值,返回也是0
14 使用sum注意 npe问题
当某一列全是空的时候,count(列名)会返回0,但是sum(列名)会返回NULL,需要特别注意。
如何解决呢?
select if(isnull(sum(列名),0,sum(列名))) from table
15 使用isnull()来判断空值
因为null与任何东西的比较都是null
16 不得使用外键和级联
通过在应用层的事务来解决
17 in 操作尽量避免
如果无法避免,控制后面个数在1000个以内
18 禁止使用select *
可能导致查询所有字段了,浪费资源。
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。