马上国庆就要结束了,再不写就要鸽了。。。
分库分表:对数据表进行切分。分库指一张表对数据落到了多个数据库上,分表一般来说指一张表落到同个数据库多张数据表上。
提到分库分表还要区分垂直和水平切分的概念。垂直切分:将一个表按照字段分成多表,每个表只存储其中一部分字段。
一般按业务场景拆分,或者按使用频率拆分。
好处:
为了避免IO争抢、减少锁表的几率。不同业务字段读写互不影响,频率高效率高业务字段表不会被低效率低频的业务字段拖垮。
为什么大字段IO效率低:
由于数据量本身大,需要更长的读取时间;
跨页,页是数据库存储单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页内存储行数少,因此IO效率较低。
数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。
水平切分:将一个表按照某一个或多个字段分成多表,每个表只存储这个表的一部分数据。
例如使用用户号切分,将尾号按00-49,50-99切分,或者hash切分等多种方法。
水平切分一般需要满足不同分库/分表的数据分布均匀。
好处:
将单一大表划分为多个小表,有利于提高数据库操作效率。
什么时候需要分库分表?
当生产环境数据不断累计会形成巨大的数据量,且随着时间推移和产品推广会日益明显,因此交易型数据一般来说都需要对数据表进行切分,达到提高效率的目的。 因此分库分表的原因简单总结为:1、数据量太大了,产品推广的进度远超预期或者一开始就预计到会产生巨大到历史数据。即使查询命中了索引耗时达到系统不可忍受的程度(不同系统忍耐程度不同,对OLTP系统来说联机响应时间很宝贵,可根据自己系统对响应时间忍受度来评估)。 具体参考:可以根据一个月交易量,一年交易量来预估,当一张表超过千万级行记录,或者表大小达到1G(Oracle可能可以更多)2、数据包含了当前和历史交易。历史表永远都累计,大多数交易都围绕这当前数据进行,一般来说历史数据在超过3-6个月后读写会直线下降,几乎为0。但作为系统仍需要为用户提供查询服务。
分区(下期再补)分库分表分区的实现复杂度:垂直分表 < 垂直分库 < 分区 < 水平分表 < 水平分库
怎么做分区分表?(下期再补)以下数据库架构图,下次再做整个架构的分析讲解。。。