1.浪费存储空间,InnoDB需要有额外一个字节存储
2.如果表内默认值Null过多,也会影响优化器选择执行计划
关于使用datatime和timestamp,现在在5.6.4之后又有了变化,使用二者存储在存储空间上大差距越来越小 ,并且本身datatime存储范围就比timestamp大很多,timestamp只能存储到2038年
索引规范单个索引字段数不超过5 单张表索引数量不超过5 索引设计遵循B+ Tree索引最左前缀匹配原则 选择区分度高的列作为索引 建立的索引能覆盖80%主要的查询,不求全,解决问题的主要矛盾。 DML和order by和group by字段要建立合适的索引 避免索引的隐式转换 避免冗余索引
关于索引规范,一定要记住索引这个东西是一把双刃剑,虽然能加速读,但也会有很多额外的写入和锁,降低写入能力。这也是为什么要控制索引数原因,之前看到过不少例子 在表里每个字段都建了索引,其实对查询可能起不到什么作用
冗余索引例子
idx_a_b_c(a,b,c)
idx_a(a) 冗余
idx_a_b(a,b) 冗余
隐式转换
字段:`remark` varchar(50) NOT Null
MySQL>SELECT `id`, `gift_code` FROM gift WHERE`deal_id` = 640 AND remark=115127;
1 row in set (0.14 sec) MySQL>SELECT `id`, `gift_code` FROM pool_gift WHERE `deal_id` = 640 AND remark=‘115127’; 1 row in set (0.005 sec)
字段定义为varchar,但传入的值是个int,就会导致全表扫描,要求程序端要做好类型检查
SQL类规范
尽量不使用存储过程、触发器、函数等
避免使用大表的JOIN,MySQL优化器对join优化策略过于简单
避免在数据库中进行数学运算 和其他大量计算任务
SQL合并,主要是指的DML时候多个value合并,减少和数据库交互
合理的分页,尤其大分页
UPDATE、DELETE语句不使用LIMIT ,容易造成主从不一致
运维规范
SQL审核,DDL审核和操作时间,尤其是OnlineDDL
高危操作检查,Drop做好数据备份
权限控制和审计
日志分析,主要是指的MySQL慢日志和错误日志
高可用方案
数据备份方案