Mysql 建立水平分表

项目需求,按月建立水平分表


目录

Mysql 建立水平分表

前言

一、使用工具

二、创建分表过程

1. 创建需要的主表

2.建立创建分表函数

3.创建建立分表事件(定时器)

4.建立存储过程

5. 常见错误:


前言

主表数据量过大,需要建立分表,提交数据查询速度


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用工具

Navicat Premium

二、创建分表过程

1. 创建需要的主表

CREATE TABLE `biao_ming` (`id` varchar(36) NOT NULL,`create_by` varchar(50) DEFAULT NULL COMMENT '创建人',`create_time` datetime DEFAULT NULL COMMENT '创建日期',`update_by` varchar(50) DEFAULT NULL COMMENT '更新人',`update_time` datetime DEFAULT NULL COMMENT '更新日期',`sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',`pack_code` varchar(32) DEFAULT NULL COMMENT '停车场编号',`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',`card_no` varchar(32) DEFAULT NULL COMMENT '卡号',`card_type` int DEFAULT NULL COMMENT '卡片类型',`cap_time` datetime DEFAULT NULL COMMENT '进出时间',`cap_place` varchar(32) DEFAULT NULL COMMENT '进出地点',`cap_flag` int DEFAULT NULL COMMENT '进出标志',`img_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图片',`cap_remark` varchar(32) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='进出明细';

如果已经有主表则不需要该步骤。

2.建立创建分表函数

分表表名:主表表名+日期,例如:biao_ming_202104

建立分表方式一:建议使用该方式创建

SUBSTR() 函数 :截取字符串

concat(str1, str2)  拼接字符串;

Prepare :

         Prepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用 prepared statements 获得很多好处,无论是性能问题还是安全问题。

Prepared Statements 可以检查一些你绑定好的变量,这样可以保护你的程序不会受到“SQL注入式”攻击。

Prepare 语法:

PREPARE statement_name FROM sql_text /*定义*/

EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/

DEALLOCATE PREPARE statement_name /*删除定义*/

delimiter //
DROP PROCEDURE IF EXISTS create_month_table //
create procedure create_month_table()
beginDECLARE table_prefix varchar(20);DECLARE table_suffix varchar(20);DECLARE tableName varchar(50); set @table_prefix = 'biao_ming_';
set @table_suffix =  SUBSTR(replace(replace(now(), '-', ''),' ', ''), 1, 6);
set @tableName =  CONCAT(@table_prefix, @table_suffix);
set @sqlstr = concat("CREATE TABLE if not exists ", @tableName," like biao_ming");
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;end //
delimiter;

建立分表方式二:

使用此方式建立分表,建议不要建立主键;

delimiter //
DROP PROCEDURE IF EXISTS create_hour_table //
create procedure create_hour_table()
beginDECLARE table_prefix varchar(20);DECLARE table_suffix varchar(20);DECLARE tableName varchar(50); set @table_prefix = 'biao_ming_';
set @table_suffix =  SUBSTR(replace(replace(now(), '-', ''),' ', ''), 1, 10);
set @tableName =  CONCAT(@table_prefix, @table_suffix);
set @sqlstr = concat("CREATE TABLE if not exists ", @tableName," (`id` varchar(36) NOT NULL,`create_by` varchar(50) DEFAULT NULL COMMENT '创建人',`create_time` datetime DEFAULT NULL COMMENT '创建日期',`update_by` varchar(50) DEFAULT NULL COMMENT '更新人',`update_time` datetime DEFAULT NULL COMMENT '更新日期',`sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',`pack_code` varchar(32) DEFAULT NULL COMMENT '停车场编号',`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',`card_no` varchar(32) DEFAULT NULL COMMENT '卡号',`card_type` int DEFAULT NULL COMMENT '卡片类型',`cap_time` datetime DEFAULT NULL COMMENT '进出时间',`cap_place` varchar(32) DEFAULT NULL COMMENT '进出地点',`cap_flag` int DEFAULT NULL COMMENT '进出标志',`img_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图片',`cap_remark` varchar(32) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='进出明细';");
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;end //
delimiter; 

创建后可以函数中查看:

3.创建建立分表事件(定时器)

创建成功后可在事件中查看:

delimiter //
CREATE EVENT e_create_month_table
ON SCHEDULE EVERY 1 MONTH STARTS TIMESTAMP '2021-04-26 02:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
CALL create_month_table();
END//
delimiter;

CREATE EVENT 语句来创建事件,其语法格式如下:

CREATE EVENT [IF NOT EXISTS] event_nameON SCHEDULE schedule[ON COMPLETION [NOT] PRESERVE][ENABLE | DISABLE | DISABLE ON SLAVE][COMMENT 'comment']DO event_body;

ON SCHEDULE schedule:必选,用于定义执行的时间和时间间隔,schedule 表示触发点。

ON COMPLETION [NOT] PRESERVE:可选; 用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即 NOT PRESERVE。

ENABLE | DISABLE | DISABLE ON SLAVE: 可选,用于指定事件的一种属性。其中,关键字 ENABLE 表示该事件是活动的,即调度器检查事件是否必须调用;关键字 DISABLE 表示该事件是关闭的,即事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字 DISABLE ON SLAVE 表示事件在从机中是关闭的。

COMMENT 'comment': 可选,用于定义事件的注释。

DO event_body:必选,用于指定事件启动时所要执行的代码,可以是任何有效的 SQL 语句、存储过程或者一个计划执行的事件。如果包含多条语句,则可以使用 BEGIN..END 复合结构。

ON SCHEDULE 子句中,参数 schedule 的值为一个 AT 子句,用于指定事件在某个时刻发生,其语法格式如下:

AT timestamp [+ INTERVAL interval]...| EVERY interval[STARTS timestamp [+ INTERVAL interval] ...][ENDS timestamp[+ INTERVAL interval]...]
  • timestamp:一般用于只执行一次,表示一个具体的时间点,后面加上一个时间间隔,表示在这个时间间隔后事件发生。
  • EVERY 子句:用于事件在指定时间区间内每隔多长时间发生一次,其中 STARTS 子句用于指定开始时间;ENDS 子句用于指定结束时间。
  • interval:一般用于周期性执行,表示一个从现在开始的时间,其值由一个数值和单位构成。例如,使用“4 WEEK”表示 4 周,使用“'1:10'HOUR_MINUTE”表示 1 小时 10 分钟。间隔的长短用 DATE_ADD() 函数支配。

interval 参数可以是以下值:

YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND

4.建立存储过程

将主表的数据转存到分表中,并删除

delimiter //
create procedure p_dr_stats_month()
begin declare v_day int;declare v_yesterday date;declare table_name VARCHAR(50);DECLARE table_prefix varchar(20);DECLARE table_suffix varchar(20);set @table_prefix = 'biao_ming_';
set @table_suffix =  SUBSTR(replace(replace(now(), '-', ''),' ', ''), 1, 6);
set @table_name =  CONCAT(@table_prefix, @table_suffix);
set @table_suffix_l = DATE_FORMAT(date_add(CURDATE(), interval -1 month),'%Y%m');
set @table_name_l = CONCAT(@table_prefix,@table_suffix_l);set v_day = DAY(curdate());
set @v_yesterday = date_sub(CURDATE(), interval 1 day);
set @last_month = date_add(curdate()-day(curdate())+1,interval -1 month);
set @curr_day = date_add(curdate(), interval - day(curdate()) + 1 day);if v_day = 28 THENset @conditions = concat( " t.create_time >= '", @last_month,"' and t.create_time < '" , CURDATE() , "';");set @sqlsebstr = concat(@table_name_l, " select * from biao_ming t where ", @conditions);set @sqlstr =   concat("insert into ", @sqlsebstr);PREPARE stmt FROM @sqlstr;EXECUTE stmt;DEALLOCATE PREPARE stmt;set @delsqlstr = concat("DELETE FROM biao_ming t WHERE ", @conditions);PREPARE stmt1 FROM @delsqlstr;EXECUTE stmt1;DEALLOCATE PREPARE stmt1;
elseset @conditions = concat( " t.create_time >= '", @v_yesterday,"' and t.create_time < '" , CURDATE() , "';");      set @sqlsebstr = concat(@table_name, " select * from biao_ming t where ", @conditions);set @sqlstr =   concat("insert into ", @sqlsebstr);PREPARE stmt FROM @sqlstr;EXECUTE stmt;DEALLOCATE PREPARE stmt;
end if;
end //
delimiter;

5. 常见错误:

表示该函数已经存在,可在函数或事件中删除:

maysql 按月建立分表相关推荐

  1. excel宏表函数技巧:如何批量建立分表?

    [前言,有关"宏表函数"的几点信息] ●在EXCEL的世界里,有一组特殊的函数存在,它不是EXCEL内置工作表函数,所以在功能区中使用"插入函数"时,是看不见它 ...

  2. sharding-jdbc系列之按月动态分表(十二)

    后续文章首发在个人博客,欢迎移驾我的个人博客浏览该文章 https://shared-code.com/article/79 欢迎关注公众号 回复 "分库分表" 获取分库分表dem ...

  3. sharding-sphere按月动态分表

    公司有个记录表,每天有几百万的数据,所以我决定按月把他分下表. 用spring整合的. 首先,sharding-sphere不支持自动创建表,所以我提前创建了两年的表,命名规则 logicTableN ...

  4. mysql年月分表_MySQL之按月拆分主表并按月分表写入数据提高数据查询速度

    使用场景: 主表数据量特别大,为了提高查询的速度,可以考虑按月进行分表,要求就是当月的数据到当月表查询,上月的数据到上月表查询,当天的数据到主表来查询.这样在一定程度上也是提高了数据的查询速度 过程演 ...

  5. mysql分表全局查询_mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表...

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  6. 使用ShardingJDBC实现按时间维度分表轻松支撑千万级数据

    文章目录 前言 一.框架搭建 二.代码编写 最麻烦的分页查询 三.题外话 源码下载 前言 之前在公司开发的一个产品,数据量巨大,疫情期间更是单月数据量增长超过100万,我们的单机MySQL数据库查询速 ...

  7. 中间表增加额外字段_如何定制分表中间件

    前言 一般来说,影响数据库最大的性能问题有两个,一个是对数据库的操作,一个是数据库中的数据太大.对于前者我们可以借助缓存来减少一部分读操作,针对一些复杂的报表分析和搜索可以交给 Hadoop 和 El ...

  8. mysql分库分表方案浅析

    分库分表(这里不讨论中间件) 分库:原因:单机负载高,优点:降低单机负载 分表:原因:单表读写压力大或者数据增长快,优点:使用多个表,提高读写效率 1.(代码)分表,即把一个很大的表达数据分到几个表中 ...

  9. Discuz论坛分表以及memcache缓存优化

    http://hi.baidu.com/nopsky/blog/item/34feffef740868e1b2fb958e.html 2011-07-14 12:24 大部分的论坛在数据量达到一定程序 ...

最新文章

  1. SPU表管理之查询获取SPU表列表数据
  2. Oracle对数据的导出和导入,建立用户,删除用户以及其下的所有表
  3. Java 8中HashMap冲突解决
  4. 004_SpringBoot整合Listener
  5. 搜索不包含关键词_新手教程!百度关键词规划师功能详解
  6. 顶会论文看不懂?阿里巴巴技术专家为你全方位解读!
  7. go语言中文件的操作:
  8. knx智能照明控制系统电路图_智能照明控制系统KNX
  9. [UML] 如何找参与者、找用例
  10. 《当时只道是寻常》——安意如——品纳兰容若《饮水词》
  11. 【转】CCIE一年后的心语
  12. “下周集中办公,你该如何防护?”一位资深HR的10个建议
  13. ArrayList 源码分析
  14. Anaconda使用总结
  15. C语言 | 函数实现比较大小
  16. H5IOSAndroid-入坑指南
  17. SMART PLC运动超驰功能编程应用(含V2.7版本固件下载)
  18. 2021-03-24---------绩优股指数和垃圾股指数-------------120日均线-----
  19. 浙江大学计算机与软件学院2019年考研复试上机模拟练习
  20. 什么是公有云、私有云和混合云?

热门文章

  1. 蜂蜜怎么做线上推广?
  2. 多伦多大学utm计算机科学,2020年加拿大留学各大学学费一览(最新)
  3. 02在windows配置适合树莓派开发的环境
  4. ccf csp分蛋糕java_CCFCSP 201703-1 分蛋糕(100score)
  5. 3G WiFi 路由器以及中小企业 网吧 上网行为管理 路由器合作开发
  6. 炫酷恶趣强大的制作神器小程序源码/支持多种流量主模式
  7. 浪涌保护器在各行业中应用的案例解析
  8. 构建知识图谱的详细步骤
  9. 解决qemu虚拟机无法设置分辨率的问题
  10. SQL两张表或者多表连接查询