例如,一个电商平台的订单表订单量非常大,每个月都会几十万笔订单,这个表不仅查询频繁,还需要频繁地进行更新、删除和插入,导致性能下降。如果将订单表按照时间拆分成多张表,即按照年份和月份分成不同的表,可以将数据量分散到多张表中,减少单张表的数据量,提高查询效率,并且在删除和插入操作时也更加快速。
MySQL的分表策略多种多样,比较常见的有垂直拆分和水平拆分。垂直拆分是将一张大表按照业务特点拆分成多张表,每张表只存储特定的字段。例如,将订单表按照订单详情、物流信息、用户信息等字段拆分出不同的表。
CREATE TABLE `order_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID', // 具体的订单信息字段 PRIMARY KEY (`id`) ) ENGINE=InnoDB CREATE TABLE `order_logistics` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID', // 物流信息字段 PRIMARY KEY (`id`) ) ENGINE=InnoDB CREATE TABLE `order_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID', // 用户信息字段 PRIMARY KEY (`id`) ) ENGINE=InnoDB
水平拆分是将一张大表按照某个规则拆分成多张表,通常是按照关键词或者数字范围进行拆分。例如,将订单表按照时间范围拆分成多张表,每张表只存储特定时间段的订单信息。
CREATE TABLE `order_201801` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID', // 2018年1月份订单信息字段 PRIMARY KEY (`id`) ) ENGINE=InnoDB CREATE TABLE `order_201802` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID', // 2018年2月份订单信息字段 PRIMARY KEY (`id`) ) ENGINE=InnoDB CREATE TABLE `order_201803` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID', // 2018年3月份订单信息字段 PRIMARY KEY (`id`) ) ENGINE=InnoDB
分表策略的应用场景不仅仅限于订单表,还可以用于用户表、商品表等大表,以提高查询效率和系统可扩展性。