分库分表

[亡魂溺海] 提交于 2019-11-30 18:03:46

为什么需要分库分表?

互联网电商系统创业初期,一般都会采用mysql数据库,可以简单、快速、可靠的实现业务需求。但随着业务的快速发展,数据量越来越多,单个库和单个表就会达到瓶颈,这时候就需要分库分表。分库分表包括分库和分表两个部分,主要有垂直分表、垂直分库、水平分表、水平分库四种方式。

垂直分表

将一个表按照字段分成多表,每个表存储其中一部分字段。

通常我们按以下原则进行垂直拆分:

1. 把不常用的字段单独放在一张表;

2. 把text,blob等大字段拆分出来放在附表中;

3. 经常组合查询的列放在一张表中;

比如下面的商品信息拆成了spu和spu_detail两张表,将大字段description拆分到spu_detail表里。这样做的好处就是我查询spu这类信息的时候不会被商品描述的低效率所拖累。

CREATE TABLE `spu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'spu id',
  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '标题',
  `cid1` int(11) NOT NULL COMMENT '1级类目id',
  `cid2` int(11) NOT NULL COMMENT '2级类目id',
  `cid3` int(11) NOT NULL COMMENT '3级类目id',
  `cname` varchar(100) NOT NULL DEFAULT '' COMMENT '类目名',
  `brand_id` int(11) NOT NULL COMMENT '商品所属品牌id',
  `price` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sku里的最低价,单位为分',
  `show_img` varchar(2000) NOT NULL COMMENT '商品spu的图片',
  `saleable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否在售:0 否,1 是',
  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除 0 否,1 是',
  `creater` int(11) NOT NULL DEFAULT '0' COMMENT '创建者',
  `updater` int(11) NOT NULL DEFAULT '0' COMMENT '更新者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='spu表';

CREATE TABLE `spu_detail` (
  `spu_id` int(11) NOT NULL,
  `description` text COMMENT '商品描述信息',
  `attr` varchar(3000) NOT NULL DEFAULT '' COMMENT '普通属性',
  `sale_attr` varchar(1000) NOT NULL COMMENT '销售属性',
  `packing_list` varchar(1000) DEFAULT '' COMMENT '包装清单',
  PRIMARY KEY (`spu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

垂直分库

垂直分库是指按照业务进行归类,将相同业务设计的表放到单独的一个库里。这样将单个库的压力分担到多个库,还能根据业务的特点进行数据库硬件的提升,比如订单库高并发,会有大量的请求,给订单库配置更好的磁盘。

 

水平分库和水平分表

水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,分担单表的压力。
水平分库是把同一个表的数据按一定规则拆到不同的数据库中,分担单库的压力。

分片规则:

hash取模:比如一个订单根据uid取余找到对应的数据库,然后再根据uid取余找到对应的表。

            优点:订单数据可以均匀分布,不会有热点问题。热点的意思就是对订单进行操作集中到1个表中,其他表的操作很少。

            缺点:随着数据越来越多,需要增加库和表的数量,这时候需要进行扩容,重新hash,将数据迁移到新表中。

range方案:以范围进行拆分数据,比如按月。缺点是会存在热点问题,比如某段时间的订单会落到一张表里的,不适用于高并发的应用。

注意:在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。

 

大量的订单存储,除了分库分表,还有一些其他的方案,比如 TIDB(开源的分布式NewSQL ),或者采用一些云计算的厂商的产品,比如阿里巴巴POLARDB。

 

冷热分离

mysql通过分库分表只存储未结束的订单。已结束的订单,进行归档到TIDB(或者其他支持海量存储的数据库,比如Hbase)中,归档成功的订单将其从mysql中删除。查询历史订单从TIDB中进行查询,未结束的订单从mysql中查询。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!