数据库优化不一定上来就是分库分表,因为表一旦拆分,开发运维的复杂度会直线上升,对于业务量没那么大的需求先不考虑分库分表,数据量在千万条以下的先考虑做单表优化。

一、单表优化

1.表分区:mysql5.1后推出,可以看做是水平拆分,分区需要在建表时加分区参数,分区表底层由多个物理字表组成,,对于代码来说,分区表是透明的;Sql中的条件最好能带上分区条件的列,这样可定位到少量的分区上,否则会扫描全区。

2.读写分离:最常用优化手段,写主库读从库

3.增加缓存:主要目的减少对数据库的访问,如redis,客户端缓存,服务端缓存

4.字段设计:单表不要有太多字段,最大范围控制在20-30,VARCHAR的长度分配正正需要的空间;尽量使用TIMESTAMP而非DATATIME;避免使用NULL,可通过设置默认值解决

5.索引优化:值域字段不适合建立索引,索引过多会对增删改造成影响;尽量不使用UNIQUE;不要设置外键,由程序保证;

6.SQL优化:尽量使用索引;避免前导模糊查询;避免In中元素过多;避免等号左边做函数运算

7.NoSql:在一些场景可以抛弃mysql关系性数据库。如:统计类、日志类,若结构化数据;事务要求低的场景。

8.表拆分

(1)垂直拆分:意思就是把一个字段较多的表,拆分成多个字段较少的表。如果初期表结构设计较为合理,则不用考虑垂直拆分。

(2)水平拆分:即分库分表。分表,解决了单表数据过大的问题,但是毕竟还在同一台数据库服务器上,所以IO、CPU、网络方面的压力,并不会得到彻底的缓解,这个可以通过分库来解决。水平拆分优点很明显,可以利用多台数据库服务器的资源,提高了系统的负载能力;缺点是逻辑会变得复杂,跨节点的数据关联性能差,维护难度大(特别是扩容的时候)。