MySql创建分区(按月分区)

本文介绍了一个具体的MySQL表分区实例,包括表结构定义、分区创建及查看分区的方法。表`ocpx_media_platform`按`create_time`字段进行月份分区,旨在提高大数据量场景下的查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.创建表

2.根据表字段创建分区

3.查看表分区


1.创建表

/*
 Navicat Premium Data Transfer

 Source Server         : rm-uf65j44c2334c4n95wo.mysql.rds.aliyuncs.com
 Source Server Type    : MySQL
 Source Server Version : 50728
 Source Host           : rm-uf65j44c2334c4n95wo.mysql.rds.aliyuncs.com:3306
 Source Schema         : hhmt_cpa

 Target Server Type    : MySQL
 Target Server Version : 50728
 File Encoding         : 65001

 Date: 19/11/2021 19:13:53
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for ocpx_media_platform
-- ----------------------------
DROP TABLE IF EXISTS `ocpx_media_platform`;
CREATE TABLE `ocpx_media_platform`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `cid` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '回调函数redis缓存key',
  `idfa` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'iOS 下的 IDFA,原文带“-”, 明文\r\n例如: 458BE47D-7205-4010- BC77-DC6E551EC514',
  `open_udid` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'iOS 下的 OpenUDID,原始 值。40 位十六进制数字。\r\n例如: 0d943976b24c85900c7 64dd9f75ce054dc5986f f',
  `imei` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'Android 下的 IMEI, IMEI 进行 MD5\r\n例如: e86607bc47b52dc939e 71e9edfe09f55\r\n安卓建议 填写',
  `oaid` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'MSA 提供的匿名设备标识符',
  `android_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'Android 下的 ANDROIDID,ANDROIDID 进行 MD5\r\n例如:559728b2022fa3cd893 605112f626359',
  `mac` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'MAC 地址转大写,去冒号, 然后 MD5 例如: e3f5536a141811db40e fd6400f1d0a4e',
  `mac1` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'MAC 地址转大写,保留冒 号,然后 MD5 例如: f8c65f0f6ea5cbffb7cb9 7cd6fae683c',
  `ip` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '点击广告的设备 IP 信息 150.255.177.215',
  `os` int(11) NULL DEFAULT NULL COMMENT '客户端操作系统的 类型 1 位数字,取 0~3。 0 表示 Android 1 表示 iOS 2 表示 Windows Phone 3 表示其他 1',
  `ts` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '客户端触发监测的时间. UTC 时间戳, ⾃1970 年起 的秒数(备注:客户端构造 点击事件的时间,如果缺 失,则使用当前时间)',
  `udid` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'iOS 下的 UDID。配置这个参 数后,会按照优先级获取设 备信息:IDFA —>OPENUDID—>MAC idfa 为 00000000-0000-0000-0 000-000000000000 时, 会认为是无效,改为传递 openudid',
  `ua` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '客户端上报数据时 http 的 header 中的 user_agent。 会 urlencode 例如: QIYIVideo%2F9.10.0%2 0(iOS%3Bcom.qiyi.iphon e%3BiOS12.0.1%3BiPho ne10%2C3)%20Corejar',
  `callback_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '激活回调地址 在广告点击的时候爱奇艺 通过callback_url=__CALLBA CK_URL__将回调地 址发 送给点击监测链接对应的 服务器,URL 用 urlencode 编码。监测平台收到对应用户的 激活信息后,向 CALLBACK_URL 发一个 http 请求,回调激活信息。 监测平台无需关心这个 URL 的构成和内容,URL 对监测平台保持透明。 注意:如您选择的是注册或 付费为转化目标,回调时请 务必添加 event_type 参 数 到链接尾部,用以区别 数据属于激活、注册或付费 (注意:如不添加,则默认 回调 的数据为“激活”数 据)。',
  `sign` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '签名 使用替换后的 url+ key 进 行 md5 生成签名。 注意!!!该字段一定放到 url 的最后,作为最后一个 参数备注:签名是为了接口反作 弊使用,一般 不推荐使用',
  `advertiser_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '账户 ID 例如:51200110321',
  `order_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '广告系列 ID 例如:62000124821',
  `order_plan_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '广告 ID 例如:63000206121',
  `creative_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '创意 ID 例如:64000276321',
  `qy_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '爱奇艺内部 ID 注意:qyid 字段取值 EncodeUR,使用需要 decode',
  `impresss_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '广告曝光 ID',
  `cloud_iqid` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '云端 iqid(内广客户需求)',
  `cell_phone_manufacturer` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '手机品牌 字段取值 EncodeUR,使 用需要 decode',
  `sua` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '在 WKWebView 中获取的 标准 UA 字段取值 EncodeUR,使 用需要 decode',
  `screen_resolution` bigint(20) NULL DEFAULT NULL COMMENT '分辨率 指的屏幕宽高比,例如: 1920,1080',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`, `create_time`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic PARTITION BY LIST (MONTH(create_time))
PARTITIONS 13
(PARTITION `p0` VALUES IN (0) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p1` VALUES IN (1) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p10` VALUES IN (10) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p11` VALUES IN (11) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p12` VALUES IN (12) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p2` VALUES IN (2) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p3` VALUES IN (3) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p4` VALUES IN (4) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p5` VALUES IN (5) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p6` VALUES IN (6) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p7` VALUES IN (7) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p8` VALUES IN (8) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p9` VALUES IN (9) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 )
;

SET FOREIGN_KEY_CHECKS = 1;

2.根据表字段创建分区

上面的sql是我通过Navicate导出的sql,如果是已经创建了表但是没有创建分区可以参考下面语句创建

alter table ocpx_media_platform PARTITION BY LIST (MONTH(create_time))
(
PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
PARTITION p1 VALUES IN (1) ENGINE = InnoDB,
 PARTITION p2 VALUES IN (2) ENGINE = InnoDB,
 PARTITION p3 VALUES IN (3) ENGINE = InnoDB,
 PARTITION p4 VALUES IN (4) ENGINE = InnoDB,
 PARTITION p5 VALUES IN (5) ENGINE = InnoDB,
 PARTITION p6 VALUES IN (6) ENGINE = InnoDB,
 PARTITION p7 VALUES IN (7) ENGINE = InnoDB,
 PARTITION p8 VALUES IN (8) ENGINE = InnoDB,
 PARTITION p9 VALUES IN (9) ENGINE = InnoDB,
 PARTITION p10 VALUES IN (10) ENGINE = InnoDB,
 PARTITION p11 VALUES IN (11) ENGINE = InnoDB,
 PARTITION p12 VALUES IN (12) ENGINE = InnoDB
)

注意点:

1.分区字段要设置为主键,不设置为主键可以参考其他方法

2.时间字段类型使用datetime

3.查看表分区

select partition_name part,partition_expression expr,partition_description descr,table_rows  from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='ocpx_media_platform'

更多详情请参考:MYSQL--表分区、查看分区 - J'KYO - 博客园

MySQL 中,可以使用分区表来提高查询性能和管理数据的效率。如果你需要按自动创建分区,可以使用 MySQL 事件调度器(Event Scheduler)和存储过程(Stored Procedure)来实现。 以下是一个示例存储过程,用于创建分区的表: ``` DELIMITER $$ CREATE PROCEDURE create_monthly_partitions() BEGIN DECLARE start_date DATE; DECLARE end_date DATE; SET start_date = '2022-01-01'; -- 分区开始日期 SET end_date = DATE_ADD(CURDATE(), INTERVAL 1 MONTH); -- 下一个的第一天 WHILE start_date < end_date DO SET @sql = CONCAT('ALTER TABLE my_table ADD PARTITION (PARTITION p', DATE_FORMAT(start_date, '%Y%m'), ' VALUES LESS THAN (TO_DAYS(\'', DATE_FORMAT(DATE_ADD(start_date, INTERVAL 1 MONTH), '%Y-%m-%d'), '\')))'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET start_date = DATE_ADD(start_date, INTERVAL 1 MONTH); END WHILE; END$$ DELIMITER ; ``` 这个存储过程会创建从当前份开始到下一个份的所有分区,每个分区以年份和份为名称,例如 p202201、p202202、p202203 等等。 然后,你可以使用事件调度器来定期运行这个存储过程,以便自动创建新的分区。以下是一个示例事件,每的第一天凌晨 1 点运行: ``` CREATE EVENT create_monthly_partitions_event ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(CURDATE(), INTERVAL 1 DAY) ON COMPLETION PRESERVE DO CALL create_monthly_partitions(); ``` 这个事件会在每的第一天凌晨 1 点运行,调用上面创建的存储过程来创建新的分区。 请注意,分区表需要使用特定的语法来查询和管理数据,因此在使用分区表时,请确保你已经理解了它们的概念和使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值