个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发、运维的复杂度会直线上升,而大多数公司和开发人员是欠缺这种能力的。
所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化。
单表优化
单表优化可以从这几个角度出发:
1.表分区
MySQL在5.1之后才有的,可以看做是水平拆分,分区表需要在建表的需要加上分区参数,用户需要在建表的时候加上分区参数;
分区表底层由多个物理子表组成,但是对于代码来说,分区表是透明的;
SQL中的条件中最好能带上分区条件的列,这样可以定位到少量的分区上,否则就会扫描全部分区。
2.增加缓存
主要的思想就是减少对数据库的访问,缓存可以在整个架构中的很多地方;
比如:数据库本身有就缓存,客户端缓存,数据库访问层对SQL语句的缓存,应用程序内的缓存,第三方缓存(如Redis等);
3.字段设计
单表不要有太多字段;
VARCHAR的长度尽量只分配真正需要的空间;
尽量使用TIMESTAMP而非DATETIME;
避免使用NULL,可以通过设置默认值解决。

4.索引优化
索引不是越多越好,针对性地建立索引,索引会加速查询,但是对新增、修改、删除会造成一定的影响;
值域很少的字段不适合建索引;
尽量不用UNIQUE,不要设置外键,由程序保证;
5.索引优化