Mysql数据库设计原则

1. 核心原则

不在数据库做运算

CPU计算务必移至业务层

控制列数量(字段少而精,字段数建议在20以内)

平衡范式与冗余(效率优先;往往牺牲范式)

拒绝3B(拒绝大SQL语句:big sql, 拒绝大事务:big transaction,拒绝大批量:big batch)

2. 字段类原则

用好数值类型(用合适的字段类型节约空间)

字符转化为数字(能转化的最好转化,同样的节约空间,提高查询性能)

避免使用NULL字段(NULL字段很难查询优化,NULL的索引需要额外的空间,NULL字段的复合索引无效)

少用text类型(使用varchar代替text)

3. 索引类原则

合理使用索引(改善查询,减慢更新,索引一定不是越多越好)

字符字段必须建前缀索引

不在索引做列运算

innodb主键推荐使用处境列(主键建立聚簇索引,主键不应该被修改,字符串不应该做主键)理解InnoDB索引保存结构就知道了)

不使用外键 (由程序保证约束)

说到不用外键,我人都傻了。有些功能是基于外键做的,其实在很多时间插入的时候也是有非常多的问题。

4. SQL类原则

sql语句尽可能的简单(一条sql只能在一个CPU运算,大语句拆小语句,减少锁时间,一条大SQL可以堵死整个库)

简单的事务

避免使用 trig/func(触发器、函数不用客户端程序取而代之)

不使用select * (消耗cpu,io内存,带宽,这种程序不具有扩展性)

OR改写为IN(or 的效率是N级别)

OR改写为UNION(mysql的索引合并很弱智)

select id from t where phone ='159'  or name = 'john';

=>

select id from t where phone = '159'

union

select id from t where name = 'john'


避免负向 %

慎用count(*)

limit 高效分页,limit值越大,效率越低

使用union all替代 union (union有去重开销)

少用连接join

使用group by

请使用同类型比较

打散批量更新



小结:

可能没有做过开发的看的时候是看不怎么懂的,这些话都是非常的精练,这些细节也决定了你的程序的响应时间。


发表评论: