1、单库表别太多,一般保持在200以下为宜。
2、尽量避免SQL中出现运算,让DB功能单一化。
3、表设计尽量小而精,能用5个字段就不要用6个(不绝对,取决于业务,改冗余时坚决不要手软)
4、SQL事物不能设计太大,比如一次性提交10W条insert,一般来说insert事物的话,5K~1W来做批处理就可以了。
5、设计表时尽量用“小数据类型”,比如尽量避免text,blob等这些大家伙,优先使用enum和set(小而美,范围有限,百益无一害)
6、设计表字段能用数字类型就千万别用字符类型,比例存IP地址,用int,别用varchar。
7、尽量避免使用null字段,定义时尽量使用not null。原因是允许null时不方便查询优化,复合索引也会失效,而且如果列有索引时会额外占用空间:a int(10) not null default 0
8、图片等大家伙不要存DB,用fastdfs等中间件或云存储都可以搞。
9、大SQL尽量拆分,多核CPU每个内核只能执行一个SQL,所以并发时,一堆小的SQL可能执行效率更高一些,并且容易命中缓存,而且不容易长时间锁表(无论什么锁都是越短约好),当然这个要结合实际情况分析,一大堆小的万一增加IO负担呢。
10、事物尽可能的小,代码别偷懒,全加一个transaction中。
11、对于非主键唯一的int类型字段,没有将其单独设置为索引比必要。设置索引后反倒增大了内存的占用,检索时的性能也不见得会有提升
12、存储过程,触发器之类的能避免就全避免,维护不方便,人员变动时,很多时候就忘了,时间一长就是全是定时炸弹。
13、禁止select *,需要啥取啥是王道
14、update时,where语句尽量要走索引,不然会全表扫描,一般情况下1G的数据至少需要10S(想想一个update锁住10S意味着什么)
15、or尽量不用,改为in(),当然in的范围太多也不行,尽量别超100
16、如果:select a from A where b=1 or c=1这种where里面不同字段进行or,尽量改为union。
select a from A where b=1
union
select a from A where c=1
17、避免“%前缀”模糊查询。因为会导致索引失效,大数据下是灾难。
18、分页时:select a from A limit 10000,10;这种大偏移量下效率非常低。可以考虑如下几个方案:
select a from A where id>xxxx limit 10;(将上一页的最大值通过where id>进行预处理,然后分页)
select a from A where id > (select a from A limit 10000,1) limit 10;
select a from A inner join (select a from A limit 10000,10) using (id);
19、避免使用count(*),在大数据下这个东西真心的慢,1000W以上要几秒,作为替代方案,考虑使用nosql例如redis,memcachd缓存下来,做定时校对。还有一个办法,直接做一个表存下来,每次增删对这个表的对应记录做update
20、union all 而非 union,看需要。一般不用去重的业务的话重压力不小,能省就省
21、尽量不要用insert select,数据量大有延迟,同步完了可能有错误。