如何对大表进行优化?
单表不拆分下的优化
- 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
- 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
- 缓存: 使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;
分库分表
垂直拆分:根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。
简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。 如下图所示:
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 拆分为: c1 c2 c3 c4 - - - - - c1 c5 c6 c7 c8 c9 c10 - 垂直拆分的优点
- 行数据变小;
- 减少读取的Block数;
- 减少I/O次数;
- 简化表的结构;
- 易于维护。
- 垂直拆分的缺点
- 主键会出现冗余;
- 需要管理冗余列;
- 会引起Join操作;
- 让事务变得更加复杂。
- 垂直拆分的优点
水平拆分 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。
水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。如下示例: 200W数据
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 拆分为两个100W 100W表A
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 100W表B c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 - - - - - - - - - - 水品拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以 水平拆分最好分库 。