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
请使用同类型比较
打散批量更新