mysql 表分区的几种方式:

  1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
  2. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  3. HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  4. KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

常用的按时间分区可以按照年、月、日等条件用来分区,因为是按时间条件分区所以选用RANGE分区方式。

分区的切条件判断:

  1. LESS THAN:如果是数值就是小于等于,时间则是小于。
  2. LESS THAN MAX:不等于。
  3. IN:包含于某某区间。

按实际分区的时间函数选用:

  1. 按日分区切分时的条件可以用day()、to_days()时间函数,需要注意的是必须是返回值是整形的。
  2. 按月分区采用month()时间函数;
  3. 其他条件分区时间函数可到我关于时间函数的博文查看:https://blog.csdn.net/qq_36216193/article/details/90404527

其中按时间字段create_date按天分区,首先需要把date字段改成主键,后添加分区切分规则

ALTER TABLE js_sys_log
DROP PRIMARY KEY,
ADD PRIMARY KEY (id, create_date);  --之前id是主键,所以这里第2主键为联合主键ALTER TABLE  js_sys_log  ADD PRIMARY KEY (create_date);

为了便于管理分区名通常以“p时间”来命名。

示例一:ALTER TABLE  js_sys_log  PARTITION BY RANGE (to_days(create_date)) (PARTITION  p20181101  VALUES LESS THAN (to_days('20181101')),PARTITION  p20181102  VALUES LESS THAN (to_days('20181102')),PARTITION  p20181103  VALUES LESS THAN (to_days('20181103')),PARTITION  p20181104  VALUES LESS THAN (to_days('20181104')),PARTITION  p20181105  VALUES LESS THAN (to_days('20181105')),PARTITION  p20181106  VALUES LESS THAN (to_days('20181106')),PARTITION  p20181107  VALUES LESS THAN (to_days('20181107')),PARTITION  p20181108  VALUES LESS THAN (to_days('20181108')),PARTITION  p20181109  VALUES LESS THAN (to_days('20181109')),PARTITION  p20181110  VALUES LESS THAN (to_days('20181110')),PARTITION  p_other  VALUES LESS THAN MAXVALUE ););

后期添加分区:

示例二:ALTER TABLE  js_sys_log  ADD PARTITION (PARTITION  p20181111 VALUES LESS THAN (TO_DAYS ('2018-11-11')));

删除分区:

示例三:ALTER TABLE  js_sys_log  DROP PARTITION p20181101;

查询MySQL的系统字典库得知所有的分区详情信息

示例四:SELECT  *  FROM  information_schema. PARTITIONS  t  WHERE t.PARTITION_NAME IS NOT NULL

在分区创建后可以通过过程和事件控制自动增加表分区。

1、查看是否开启事件

show variables like "event_scheduler";


2、开启事件(本次设置中生效)

SET GLOBAL event_scheduler = on;
或
SET GLOBAL event_scheduler = 1;

3、开启时间(长期生效)
编辑 mysql 配置文件,并在【mysqld】下添加该变量:

再重启 mysqld 服务, 登录 mysql ,查看配置,确认是否生效。

4、设置分区脚本

use test;DELIMITER ||
-- 删除存储过程
drop procedure if exists 事件名称 ||
-- 注意:使用该存储过程必须保证相应数据库表中至少有一个手动分区
-- 创建存储过程[通过数据库名和对应表名]-建多少个分区,分区时间间隔为多少
-- databasename:创建分区的数据库
-- tablename:创建分区的表的名称
-- partition_number:一次创建多少个分区
-- partitiontype:分区类型[0按天分区,1按月分区,2按年分区]
-- gaps:分区间隔,如果分区类型为0则表示每个分区的间隔为 gaps天;
-- 如果分区类型为1则表示每个分区的间隔为 gaps月
-- 如果分区类型为2则表示每个分区的间隔为 gaps年
create procedure 事件名称 (in databasename varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,in tablename varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, in partition_number int, in partitiontype int, in gaps int)
L_END:
begin     declare max_partition_description varchar(255) default '';declare p_name varchar(255) default 0;       declare p_description varchar(255) default 0;   declare isexist_partition varchar(255) default 0; declare i int default 1;-- 查看对应数据库对应表是否已经有手动分区[自动分区前提是必须有手动分区]select partition_name into isexist_partition from information_schema.partitions where table_schema = databasename  and table_name = tablename limit 1;-- 如果不存在则打印错误并退出存储过程if isexist_partition <=> "" thenselect "partition table not is exist" as "ERROR";leave L_END;end if;-- 获取最大[降序获取]的分区描述[值]select partition_description into max_partition_description  from information_schema.partitions where table_schema = databasename  and table_name = tablename order by partition_description desc limit 1;-- 如果最大分区没有,说明没有手动分区,则无法创建自动分区if max_partition_description <=> "" thenselect "partition table is error" as "ERROR";leave L_END;end if;-- 替换前后的单引号[''两个引号表示一个单引号的转义]-- set max_partition_description = REPLACE(max_partition_description, '''', '');-- 或使用如下语句set max_partition_description = REPLACE(max_partition_description-1, '\'', '');-- 自动创建number个分区while (i <= partition_number) doif (partitiontype = 0) then-- 每个分区按天递增,递增gaps天set p_description = DATE_ADD(FROM_DAYS(max_partition_description), interval i*gaps day); elseif (partitiontype = 1) then-- 每个分区按月递增,递增gaps月set p_description = DATE_ADD(FROM_DAYS(max_partition_description), interval i*gaps month); else -- 每个分区按年递增,递增gaps年set p_description = DATE_ADD(FROM_DAYS(max_partition_description), interval i*gaps year);end if;-- 删除空格set p_name = REPLACE(p_description, ' ', '');-- 例如10.20的记录实际是less than 10.21set p_description = DATE_ADD(p_description, interval 1 day); -- 如果有横杆替换为空set p_name = REPLACE(p_name, '-', '');-- 删除时间冒号set p_name = REPLACE(p_name, ':', '');-- alter table tablename add partition ( partition pname values less than ('2019-05-22 23:59:59') );set @sql=CONCAT('ALTER TABLE ', tablename ,' ADD PARTITION ( PARTITION p', p_name ,' VALUES LESS THAN (TO_DAYS(\'', p_description ,'\')))');-- set @sql=CONCAT('ALTER TABLE ', tablename ,' ADD PARTITION ( PARTITION p', p_name ,' VALUES LESS THAN (TO_DAYS(\'', p_description ,'\')))');-- 打印sql变量-- select @sql;-- 准备sql语句PREPARE stmt from @sql;-- 执行sql语句EXECUTE stmt;-- 释放资源DEALLOCATE PREPARE stmt;-- 递增变量set i = (i + 1) ;end while;
end ||
-- 恢复语句中断符
DELIMITER ;

5、事件处理(每天执行一次)

DELIMITER ||
drop event if exists 事件名称 ||
create event 事件名称
on schedule every 1 day
starts '2019-05-22 23:59:59'
do
BEGINcall 事件名称 ('数据库名', '分区表名', 1, 0, 1);
END ||
DELIMITER ;

6、删除事件

DROP EVENT [IF EXISTS] 事件名称;

7、查看事件

show events;

8、表分区查看:

explain partitions select * from 分区表名;

mysql 表分区、按时间函数分区、删除分区、自动添加表分区相关推荐

  1. mysql按照时间自动创建分区表_mysql 表分区、按时间函数分区、删除分区、自动添加表分区...

    mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...

  2. MySQL中常用日期时间函数及获得

    MySQL中常用日期时间函数: 下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DA ...

  3. MySQL 的日期和时间函数

    MySQL 的日期和时间函数 官网:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_str- ...

  4. mysql 日期和时间函数_介绍一下mysql的日期和时间函数

    介绍一下mysql的日期和时间函数 mysql> SELECT PERIOD_DIFF(9802,199703); -> 11 DATE_ADD(date,INTERVAL expr ty ...

  5. Mysql定义DELETE操作触发器,将删除数据存入历史表

    Mysql定义DELETE操作触发器,将删除数据存入历史表 SQL如下: // An highlighted blockDELIMITER $$ CREATE TRIGGER <触发器名称> ...

  6. Mysql 中的日期时间函数汇总

    日期和时间函数 MySQL中内置了大量的日期和时间函数,能够灵活.方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数. 1 CURDATE()函数 CURDATE()函数用于 ...

  7. 图形界面 I: 用于表单按钮的函数与删除界面元素 (第四章)

    目录 简介 表单按钮的函数 删除界面元件 结论 简介 本文是关于图形界面系列文章第一部分的续篇. 第一篇文章图形界面 I: 库结构的准备工作 (第一章) 详细解释了库的目标. 在每章末尾会有第一部分文 ...

  8. 【mysql】日期和时间函数

    文章目录 日期和时间函数 1. 获取日期.时间 2. 日期与时间戳的转换 3. 获取月份.星期.星期数.天数等函数 4. 日期的操作函数 5. 时间和秒钟转换的函数 6. 计算日期和时间的函数 7. ...

  9. mysql批量取消多行sql_mysql批量删除指定前缀的表,批量修改表名的SQL语句

    批量删除指定前缀的表 Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where tabl ...

最新文章

  1. eigen跟踪MILTracker
  2. ES6之路第九篇:Set和Map数据结构
  3. lisp正负调换_坐标提取lisp程序
  4. 亿佰特物联网dtu无线数传电台:新一代Lora无线模块通信技术
  5. 如何把本地yum源给其他机器使用_如何使用系统安装盘做yum的本地源?
  6. 键值 keyCode事件属性
  7. 如何在Redhat7.4安装CDH6.2
  8. opencv图像分析与处理(15)- 图像压缩中的编码方法:霍夫曼编码、Golomb编码、Rice编码、算术编码及其实现
  9. Candy leetcode java
  10. 大话uboot 移植
  11. 电路基础知识总结(精华版)
  12. 千图成像python_吞了1000瓶老干妈的南山头铁鹅,Python制作千图成像(附上源代码和应用程序)...
  13. 微软浏览器Edge不能上网的解决办法
  14. ClickHouse 之 FORMAT 应用
  15. 利用BaiduPCS-Go批量秒传与备份
  16. bzoj3786 星际探索 splay dfs序
  17. 利用Python提取ABAQUS的计算结果(ODB)信息
  18. 总结了下PHPExcel官方读取的几个例子
  19. Linux 网络设备驱动(dm9000)
  20. ERP软件对服装行业的好处有哪些?

热门文章

  1. gta5因为计算机丢失,GTA5丢失MSVCR100.dll怎么办 修复方法介绍
  2. 关于天龙八部3的感想
  3. 软件测试基础面试常问问题(二)
  4. CSS(七) css列表样式(ul)
  5. 阿德莱德大学语言班成绩为C,留学攻略—阿德莱德大学语言班
  6. javax.el.ELException Cannot convert 0e27d734-c316-4e13-8770-161092a2b3c4 of type class java.lang.Str
  7. 【无标题】vue -解决“You may use specia I comments to disa some warnings. ble Use//eslint-disable-next-line
  8. R语言辅导高维数据的主成分pca、 t-SNE算法降维与可视化分析案例报告
  9. Rust之Some()与OK()
  10. 怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关