【mysql】日志表-表分区

背景

因业务量越来越大,原本日志表是普通表,日志量越来越大,已达到千万级,且因相关查询统计需要频繁查询日志表,导致查询越来越慢,严重影响体验,故提出把日志表由普通表转为分区表,设计是按照ID+transDate 来分区,按照交易量,每个月一个区。

若对业务背景没有兴趣,可跳过,直接看后面步骤。【打扰】

注意

因为特殊场景特殊业务背景,要求我们对存量日志表的数据需要保留,且对新分区表重新开始记录日志。同时为了考虑千万级别数据量为此,我们对存量表进行重命名。在复制了存量表结构的前提下,对新表进行改造成分区表。

修改过程

1. 重命名表

rename table t_trans_log to t_trans_log_bak;

千万数据量表重命名,耗时0.06s。从而不中断业务。

2. 创建新表,复制存量表的表结构

create table t_trans_log like t_trans_log_bak;

-- 检查新表结果和索引,均无误。
show index from t_trans_log;

-- 新表需要重新开始记录,需要把ID自增列设置为初始值1
select auto_incrememt from information_schema.`TABLES` where table_name=`t_trans_log` limit 1;
-- 若不为1,则需要设置为1(一般新建表,自增列是初始值,或者truncate表后,自增列也是默认值)
ALTER TABLE t_trans_log AUTO_INCREMENT=0

3. 修改表字段

-- 增加主键,通过主键进行分区
-- 自增列无法删除主键,先去掉自增列
alter table t_trans_log modify column `id` bigint(11) not null;
-- 删除主键
alter table t_trans_log drop primary key;
-- 新增组合主键
alter table t_trans_log add primary key(`id`,`trans_date`);
-- 还原ID为自增列
alter table t_trans_log modify column `id` bigint(11) not null auto_increment;

4. 修改表为分区表

-- 创建两年的分区
 alter table t_trans_log partition by rang columns(trans_date)
 (
PARTITION `P2201` VALUES LESS THAN ('2022-02-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2202` VALUES LESS THAN ('2022-03-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2203` VALUES LESS THAN ('2022-04-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2204` VALUES LESS THAN ('2022-05-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2205` VALUES LESS THAN ('2022-06-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2206` VALUES LESS THAN ('2022-07-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2207` VALUES LESS THAN ('2022-08-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2208` VALUES LESS THAN ('2022-09-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2209` VALUES LESS THAN ('2022-10-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2210` VALUES LESS THAN ('2022-11-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2211` VALUES LESS THAN ('2022-12-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2212` VALUES LESS THAN ('2023-01-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2301` VALUES LESS THAN ('2023-02-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2302` VALUES LESS THAN ('2023-03-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2303` VALUES LESS THAN ('2023-04-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2304` VALUES LESS THAN ('2023-05-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2305` VALUES LESS THAN ('2023-06-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2306` VALUES LESS THAN ('2023-07-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2307` VALUES LESS THAN ('2023-08-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2308` VALUES LESS THAN ('2023-09-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2309` VALUES LESS THAN ('2023-10-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2310` VALUES LESS THAN ('2023-11-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2311` VALUES LESS THAN ('2023-12-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `P2312` VALUES LESS THAN ('2024-01-01') ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION PMORE VALUES LESS THAN MAXVALUE ENGINE = InnoDB
 )

5. 查看表分区详情

select * from information_schema.`PARTITIONS` where table_name='t_trans_log';

表分区详情:

表分区详情

完成

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 拼多多交易MySQL包含了以下几个主要字段: 1. 订单编号(order_id):用于唯一标识每一个订单。订单编号可以通过自增主键或者UUID等方式生成,保证每个订单都有唯一的标识。 2. 用户ID(user_id):记录购买商品的用户ID。每个用户可以有多个订单,通过用户ID可以将订单和用户进行关联。 3. 商品ID(product_id):记录被购买的商品ID。每个订单可以包含多个商品,通过商品ID可以将订单和商品进行关联。 4. 订单状态(status):记录订单的当前状态,如待支付、已支付、待发货、已发货、已完成等。根据订单状态的不同,可以进行相关的业务逻辑处理。 5. 下单时间(create_time):记录订单的创建时间,用于统计订单的下单和处理速度。 6. 支付时间(payment_time):记录订单的支付时间,用于统计订单的支付速度。 7. 发货时间(delivery_time):记录订单的发货时间,用于统计订单的物流配送速度。 8. 收货时间(receive_time):记录订单的收货时间,用于统计订单的配送到达速度。 9. 支付方式(payment_method):记录订单的支付方式,如支付宝、微信支付、银行卡等。 10. 收货地址(address):记录订单的收货地址,用于配送商品。 通过这些字段,可以对拼多多交易MySQL进行查询和分析,包括订单的状态变化、用户购买行为、商品销售情况等。可以通过索引等方式优化查询性能,提高数据库的响应速度。同时,还可以对数据进行备份和恢复,确保数据的安全性。 ### 回答2: 拼多多交易MySQL是用于存储拼多多平台的交易数据的数据库。该包含了拼多多用户的交易信息,包括订单号、用户ID、商品ID、购买数量、交易金额、交易时间等字段。 在拼多多交易MySQL中,每一条记录代了一次用户的交易行为。订单号用于唯一标识每一笔交易,用户ID可用于识别交易相关的用户,商品ID用于标识被交易的商品。 购买数量字段示用户购买的商品的数量,交易金额字段示用户在该次交易中的支付金额。交易时间字段记录了交易的具体时间,有助于统计分析交易数据的日志。 拼多多交易MySQL的设计需要考虑数据的完整性和有效性,一般会设置主键、外键和索引等约束来保证数据一致性。此外,还可以根据需求添加一些额外的字段,如交易状态、退款金额等来满足更详细的数据分析需求。 拼多多交易MySQL的优化也是一个关键问题,可以通过合理的结构设计、选择合适的数据类型、使用索引和分区等方式来提升查询性能和数据处理效率。 总之,拼多多交易MySQL是拼多多平台的核心数据存储之一,它承载着拼多多交易系统的交易数据,并为数据的管理、查询和分析提供了便利。 ### 回答3: 拼多多交易MySQL是用于存储拼多多电商平台上的交易相关数据的数据库MySQL是一种广泛使用的关系型数据库管理系统,能够提供高性能、高可用性以及可扩展性。 拼多多交易MySQL中通常包含以下字段:订单号、商品ID、买家ID、卖家ID、交易金额、交易时间等。这些字段记录了每一笔交易的具体信息,用于后续的数据分析、报生成和业务决策。 在拼多多交易MySQL中,可以通过各种查询操作来获取需要的数据,如按时间查询某一段时间内的交易情况,按买家ID查询该买家的交易历史等。此外,还可以通过事务和锁机制来实现数据的一致性和并发控制,保证交易数据的可靠性和完整性。 为了提高性能,可以根据实际情况对拼多多交易MySQL进行数据分区、建立索引以及优化查询语句等。此外,定期备份和监控MySQL数据库的运行状态也是非常重要的,以防止数据丢失和故障发生。 总之,拼多多交易MySQL是拼多多电商平台的核心数据存储方式之一,为平台提供了稳定、高效的数据支持,帮助实现交易数据的管理与分析。同时,合理的设计和运维也将对平台的稳定性和用户体验产生积极的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值