Mysql根据创建时间表分区实践

news2024/12/23 13:40:22

背景

最近订单表遇到大数据量的问题,并且表中随着时间的积累会变得更大,当数据量较大时,存储的物理文件会变得非常大、使用性能很差。
我们用的是GaussDB。为了提高查询效率,建议表大于500w进行分区,所以在规划阶段我们就进行分区。根据公司业务发展评估,按照年进行表分区。目的就是缓解磁盘io,提高查询效率。

解决方式

文件太大,常用思路是拆表、减少单表数据量,这样每个表文件变小、性能和维护都会更容易。
一般有两种拆分方式:
水平拆分。即同个结构的表建多个,按一定规则将不同的行放到不同的表。
按主键、数据所属用户或其他列,使用Hash、一致性Hash、Hash字典等方式
垂直拆分。将不同的表放到不同的数据库。
一般按业务模块拆分。

方式:MySQL partition

根据我的的需求,按照创建时间按照年分区
分区命令:
将表ar_sale_order_to_c 根据创建时间creation_date
创建时间格式为:(2023-07-04 04:30:29),需要用年,所以通过函数 YEAR(creation_date) 获取字段年,然后进行分区

ALTER TABLE ar_sale_order_to_c PARTITION BY RANGE (YEAR(creation_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION p2026 VALUES LESS THAN (2027),
PARTITION p2027 VALUES LESS THAN (2028),
PARTITION p2028 VALUES LESS THAN (2029),
PARTITION p2029 VALUES LESS THAN (2030),
PARTITION p202X VALUES LESS THAN (MAXVALUE)
);

常见问题

分区键(用来分区的列)须同时存在于所有的primary key和unique key中,这是最容易出现问题。
我的表结构:

CREATE TABLE `ar_sale_order_to_c` (
  `order_id` bigint NOT NULL AUTO_INCREMENT,
  `order_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单号',
  `company_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '所属公司',
  `sales_organization` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '销售组织(弃用)',
  `batch_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单批次号',
  `source_system` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '来源系统',
  `order_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单类型',
  `rcc_status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '对账状态',
  `rcc_date` datetime DEFAULT NULL COMMENT '对账完成时间',
  `order_reason` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单原因',
  `source_platform` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '来源平台',
  `platform_order_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '来源平台订单号',
  `currency` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '币种',
  `client` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户(shop_code)',
  `manual_orders_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否为手工订单',
  `source_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '关联订单编号',
  `distribute_channel` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分销渠道',
  `interface_call_time` datetime DEFAULT NULL COMMENT '接口时间戳',
  `statement_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '原始账单号',
  `discount_amount` decimal(20,6) DEFAULT NULL COMMENT '优惠金额',
  `order_create_time` datetime DEFAULT NULL COMMENT '订单时间戳',
  `merchant_remarks` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商家备注',
  `shipping_location` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货库位',
  `sales_channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '销售渠道',
  `sales_channel_des` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '销售渠道描述',
  `delivery_gen_flag` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'N' COMMENT '是否生成为交货单确认信息',
  `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
  `object_version_number` bigint DEFAULT '1' COMMENT '行版本号,用来处理锁',
  `creation_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `created_by` bigint NOT NULL DEFAULT '-1',
  `last_update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_updated_by` bigint NOT NULL DEFAULT '-1',
  `partion_value` bigint DEFAULT NULL COMMENT '分库值',
  PRIMARY KEY (`order_id`) USING BTREE,
  UNIQUE KEY `ar_sale_order_to_c_u1` (`order_number`,`tenant_id`) USING BTREE,
  KEY `ar_sale_order_to_c_n1` (`statement_number`,`tenant_id`) USING BTREE,
  KEY `ar_sale_order_to_c_n3` (`source_platform`,`tenant_id`) USING BTREE,
  KEY `ar_sale_order_to_c_n4` (`platform_order_number`,`tenant_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5299 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='订单头(C端)';


因为我的分区键(用来分区的列)没有同时存在于所有的primary key和unique key中。所以创建分区键会报错

1、分区键不在primary key
报错提示:

A PRIMARY KEY must include all columns in the table's partitioning function

解决方式:
在 primary key中增加分区键creation_date

alter table ar_sale_order_to_c drop primary key,add primary key (`order_id`,`creation_date`); 

2、分区键不在unique key

报错提示:

A UNIQUE INDEX must include all columns in the table's partitioning function

解决方式
在unique key中增加分区键creation_date

alter table ar_sale_order_to_c drop index `ar_sale_order_to_c_u1`;
alter table ar_sale_order_to_c add unique key `ar_sale_order_to_c_u1` (`order_number`,`tenant_id`,`creation_date`);

最后:在重新执行以上得创建分区命令。

验证

为了验证以下两张表一个分区一个没有分区,数据都是一样得
ar_sale_order_line_to_c_no_partition(为分区)
ar_sale_order_line_to_c_partition(已分区)
未分区得表示例查询扫描4910872条数据
在这里插入图片描述
分区后表查询示例扫描:1984
在这里插入图片描述

执行时间:
在这里插入图片描述

结论

分区后,查询效率极大得提升

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv基础47 查找图像轮廓cv2.findContours()详解

什么是图像轮廓? 图像轮廓是指图像中物体边缘的连续性曲线。在计算机视觉和图像处理中,轮廓通常被用于检测物体、分割图像以及提取物体特征。 图像轮廓是由一系列连续的像素点组成,这些像素点位于物体边界上。轮廓的特点是在物体和背景之间的…

springboot生成表结构和表数据sql

需求 业务背景是需要某单机程序需要把正在进行的任务导出,然后另一台电脑上单机继续运行,我这里选择的方案是同步SQL形式,并保证ID随机,多个数据库不会重复。 实现 package com.nari.web.controller.demo.controller;import cn…

Android 11 获取启动其他应用

Android 11 获取启动其他应用 本文代码地址 https://gitee.com/chenjim/QueryAppInfo 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 如果应用以 Android 11(API 级别 30)或更高版本为目标平台,并查询与设备上已安装的其他应用相…

Python 面试必知必会(一):数据结构

《Python Cookbook》的作者David Beazley的课程PPT开源了,目标用户是希望从编写基础脚本过渡到编写更复杂程序的高级 Python 程序员,课程主题侧重于流行库和框架中使用的编程技术,主要目的是更好地理解 Python 语言本身,以便阅读他…

简易图书管理系统(面向对象思想)

目录 前言 1.整体思路 2.Book包 2.1Book类 2.2BookList类 3.user包 3.1User类 3.2NormalUser类 3.3AdminUser类 4.operation 4.1IOPeration接口 4.2ExitOperation类 4.3FindOperation类 4.4ShowOperation类 4.5AddOperation类 4.6DelOperation类 4.7BorrowOpera…

下半年提速拓店,为什么说屈臣氏引领美妆零售的未来?

屈臣氏过去是美妆零售的先锋,目前来看它或许仍然是先锋。 杰弗里摩尔在《公司进化论》中总结提出,自由市场经济运作的方式,遵循着一些类似自然界有机系统的定律:通俗来说,资源竞争带来“刺激创新”——由消费者偏好形…

看重ARM?苹果、三星、英伟达等知名企业纷纷表示加大投资

根据日经亚洲的报道,芯片设计公司Arm计划进行首次公开募股并在纳斯达克上市。苹果、三星电子、英伟达、英特尔等知名企业计划在Arm美股上市后投资该公司。 据悉,Arm将于9月份上市,预计估值将达到至少600亿美元(约合4314亿元人民币…

【PyQt5+matplotlib】获取鼠标在canvas上的点击坐标

示例代码: import sys import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasclass MyMainWindow(QMainWindow):de…

vulnhub靶场-y0usef笔记

vulnhub靶场-y0usef笔记 信息收集 首先fscan找到目标机器ip http://192.168.167.70/ nmap扫描端口 Host is up (0.00029s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ub…

(十五)大数据实战——hive的安装部署

前言 Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。本节内容我们主要介绍一下hive的安装与部署的相关内容。 正文 上传hive安装包到hadoop101服务器/opt/software目录 解…

Reinforcement Learning with Code (对比Monte-Carlo与TD算法)【Code 3. MonteCarlo】

Reinforcement Learning with Code & (对比Monte-Carlo与TD算法)【Code 3. MonteCarlo】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced s…

成功搞定H7-TOO的FreeRTOS Trace图形化链表方式展示任务管理

之前推出了H7-TOOL的RTOS Trace功能,已经支持RTX5,ThreadX,uCOS-III,uCOS-II和FreeRTOS,特色是不需要目标板额外做任何代码,实时检测RTOS任务执行情况,支持在线和脱机玩法,效果是下面…

网络编程——字节序和地址转换

字节序和地址转换 一、字节序 1、字节序概念 是指多字节数据的存储顺序,数据在内存中存储的方式 2、分类 大端序(网络字节序):高位的数据存放在低地址位 arm架构、交换机、路由器 小端序(主机字节序):高位的数据存放在高地址位 x86架构计算机 注意 …

10_Vue3 其它的组合式API(Composition API)

Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown,但相对之下它的功能更加强大和灵活。 命名方式灵活,不限于unittest的setup、teardown可以实现数据共享,多个模块跨文件共享前置后置可以实现多个模块跨…

fastadmin自定义键值组件Fieldlist

需求场景: 后台设置前端的固定话费充值金额。编辑时要求能够增删改,给到前端的数据,是要根据金额正序排列,用fastadmin的键值组件(Fieldlist),使用Art-Template模板语法自定义模板。 最终效果如下图所示: …

【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

ECANet(Efficient Channel Attention Network)是一种用于图像处理任务的神经网络架构,它在保持高效性的同时,有效地捕捉图像中的通道间关系,从而提升了特征表示的能力。ECANet通过引入通道注意力机制,以及在…

CSDN 直播:腾讯云大数据 ES 结合 AI 大模型与向量检索的新一代云端检索分析引擎 8月-8号 19:00-20:30

本次沙龙围绕腾讯云大数据ES产品展开,重点介绍了腾讯云ES自研的存算分离技术,以及能与AI大模型和文本搜索深度结合的高性能向量检索能力。同时,本次沙龙还将为我们全方位介绍腾讯云ES重磅推出的Elasticsearch Serverless服务,期待…

Go重写Redis中间件 - Go实现Redis集群

Go实现Redis集群 这章的内容是将我们之前实现的单机版的Redis扩充成集群版,给Redis增加集群功能,在增加集群功能之前,我们先学习一下在分布式系统中引用非常广泛的技术一致性哈希,一致性哈希在我们项目里就应用在我们Redis集群的搭建这块 详解一致性哈希 Redis集群需求背…

SDXL 1.0出图效果直逼Midjourney!手把手教你快速体验!

介绍 最近,Stability AI正式推出了全新的SDXL 1.0版本。经过我的实际测试,与之前的1.5版本相比,XL的效果有了巨大的提升,可以说是全方位的超越。不仅在理解提示词方面表现出色,而且图片的构图、颜色渲染和画面细腻程度…