分库分表
2020-01-05 本文已影响0人
chanming
之前我们讲过利用数据库的读写分离提升数据库的读写性能,今天我们再来聊一聊数据库优化的另外一个重量级武器,分库分表。
我们先来想想这样的一个业务场景,我们有一个数据库,存放着用户的订单数据,随着我们的业务的发展,订单的数据越来越多,由此会引来一系列的问题。
首先,单库的数据量会变得越来越大,占据大量的磁盘空间,在进行数据迁移、备份、恢复所需要的时间都会越来越长。
其次,系统的容灾性将变差,没有万无一失的系统,也没有万无一失的机器,更没有万无一失的运维工程师与程序员,一旦我们的数据库遭遇到破坏,将会牵连所有的业务与用户。
最后,是系统的性能会大大降低,读写速度会变慢,即便是我们使用了索引,也会发现读写的速度越来越慢,这是为什么呢?有两个主要的原因,一是随着数据量的增多,扫描数也会增多,一旦我们的索引不合理,或者没有命中索引,将带来灾难性的结果,另外一个重要的原因,是索引会变得越来越大,每次变更索引的变更也会消耗时间,并且可能因为索引过大,无法直接存放在内存,每次都需要从磁盘中加载索引,造成速度变慢。
从另外一个角度看,单台机器的性能都是有限的,即便我们可以使用多个从库,但也会造成数据的冗余与浪费。分库分表,可以帮我们非常好的解决这个问题。分库分表,顾名思义,就是把数据分散存储在不同的数据库与数据表中。我们有两种常见的分库分表方法:
垂直切分,垂直切分,既按照不同的功能,将不同业务的数据,存放到不同的数据库中,我们仍然以电商系统为例,我们可以将用户性别、收货地址、账号等存放在用户库中,将商品的图片、描述、详情存放在商品数据库中,将用户的订单数据存放在交易数据库中,不同的数据库之间可以互相隔离,互补影响,这样子,可以做到一方出故障的时候,对其他影响最小。
水平切分,水平切分,即同一个功能按照一定的维度切割,将他们放到不同的表中。我以阿里巴巴的淘宝天猫数据为例,不同用户之间的交易数据,一般都是不互通的,也少有需要跨表查询场景,于是可以用户的ID哈希,将其分布在不同的数据库数据表中,商品的数据,最常见的场景,便是一个店铺下所有的商品,我们极少需要跨店铺去查询商品的数据(搜索页、推荐页等的不算,这种场景一般也不是走数据库查询),所以通常是以商家ID进行分表的。
通过分库分表,我们可以让数据库每一张表的数据都比较可控,从而提高数据库的效率。当然,分库分表也并非十全十美,也会带来一些问题,例如,在某些业务场景,我们可能需要查询跨表的数据,将会变得非常麻烦。同时,如果数据库需要一些连接操作,也会变得箱单麻烦。想要知道如何解决这些问题的么?欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)