参考:
数据越来越多,数据库越来越慢该怎么办
方案一:读写分离,主从复制
方案二:归档历史数据
当单表的数据太多,多到影响性能的时候,首选的方案是,归档历史数据。就是把大量的历史数据移到另外一张历史数据表中,因为像订单这类具有时间属性的数据,都存在热尾效应。大多数情况下访问的都是最近的数据。因为新数据只占数据总量中很少的一部分,所以把旧数据和新数据分开存放,可以提高新数据的查询效率。这种方法能起到的效果好,且对系统的改动小,升级成本低
方案三:分库分表
分库主要是为了减少每个数据库服务器的访问量,分表主要是为了提高对单个表的数据的查询速度。
并发大就分库:可以拆分业务就垂直分库,否则水平分库
查询慢就分表:有冗余字段就垂直分表,否则就水平分表
水平分表
以字段的值为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。把记录分别存到不同的表中
场景:
系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。例如表中分表记录各个地区的数据或者不同时期的数据,特别是有些数据常用,有些不常用。
缺点:
1、给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作
2、在许多数据库应用中,这种复杂度会超过它带来的优点,查询时会增加读一个索引层的磁盘次数
2、在许多数据库应用中,这种复杂度会超过它带来的优点,查询时会增加读一个索引层的磁盘次数
垂直分表
以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。将同一条记录前半段存到一个表中,后半段存到一个表中
场景:
系统绝对并发量并没有上来,表中某些列常用,另外一些列不常用,可以使数据行变小,可以把常用的列和不常用的列放在不同的表中,这样一个数据页能存储更多数据,查询时减少I/O次数
缺点:
管理冗余列,查询所有数据需要join操作
水平分库
以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中
场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。
垂直分库
以表为依据,按照业务归属不同,将不同的表拆分到不同的库中
场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。