什么是分表分库
分库分表是指将原本存储在单一数据库中的数据,拆分到多个数据库或者多个数据表中,通过这样的方式来提高数据库的性能。
为什么要分表分库
随着业务的发展,数据量不断增长,单一数据库的存储容量可能无法满足需求。单机数据库的存储能力、连接数是有限的,它自身就很容易会成为系统的瓶颈。举例MYSQL来说,当单表数据量在百万以里时,我们还可以通过添加从库、优化索引提升性能。当单表数据达到千万级别时,其查询等性能会严重下降,通过建立索引等方法我们已经无法实现对数据库性能的提升,所以需要通过分表分库的方法来提高系统的性能。
因为数据库的容量是固定的,随着数据量的增长,为了解决容量不够的问题,最简单的方法就是增加容量。其次,高并发也是需要考虑的问题,由于数据库的连接数有限,通过分库的方法能缓解单数据库连接压力,从而提高系统并发处理能力。
除此之外,通过将不同的数据分散到不同的库和表中,可以增加数据的安全性。当某个数据库或表发生数据泄露或损坏时,其他数据库和表的数据仍然是安全的。
垂直分库分表
垂直分库是按照业务功能将数据分散到不同的数据库中。不同的业务功能可以独立存在于不同的数据库中,使得各个业务之间相互独立,减少了数据库之间的关联和依赖。垂直分表是将单个表按照列的特性进行拆分。将一个表中的列按照业务功能或者访问频率进行划分,使得每个表的列数减少,提高了查询性能和存储效率。
比如对于用户表,我们经常访问的是用户名和密码等登录信息,而用户的个人详细信息不会经常性访问以及修改,所以我们可以把用户表拆分成用户登录表和用户信息表,通过外键等方式进行关联。通过对字段更新频率这一条件将表进行垂直拆分,减少频繁更新字段对整个表的锁定,提高系统的并发性能。又或者根据不同的业务功能对数据库进行拆分,这样不同数据库之间的访问不会相互影响,提高了系统的整体性能。
水平分库分表
水平分库分表是将数据按照一定规则分散导多个数据库或统一数据库的多个表中。根据一定逻辑比如时间范围或者业务维度,将一个库拆分为多个库或将一个表拆分为多个表。例如根据id通过取模获得值来进行水平分库存储数据。通过这样的方式来减少单库或单表存储的数据量,从而到达提升系统性能的目的。
分库分表原则
是否需要进行分库分表应该根据实际业务需求和数据库性能瓶颈来决定,原则上是能不分就不分,数据库表之间的关系一定上映射了业务逻辑,分库分表的行为会增加业务逻辑的复杂度,会使得后续维护的成本上升。因此分库分表是数据量过大后的无奈之举。
当数据量过大、已经无法通过升级外设或提高数据库性能等方式缓解时,可以进行分库分表。又或者是某个库某个表的某条数据被经常性访问导致整表被锁定修改,我们可以通过分表分库的方法来解决,若有表字段设计不合理的地方也可以通过垂直拆分的方式进行优化。