使用创建分表存储过程
set @field_list ='
`syslog_id` int(11) NOT NULL AUTO_INCREMENT,
`create_user` varchar(32) DEFAULT NULL,
PRIMARY KEY (`syslog_id`)
';
call branch_table('test', @field_list, 4, 2);
创建分表存储过程
DROP PROCEDURE IF EXISTS `branch_table`;
CREATE PROCEDURE `branch_table`(
IN p_table_name VARCHAR(200),
IN p_field_list VARCHAR(2048),
IN p_branch_size INT,
in p_lpad INT
)
BEGIN
/*定义变量*/
DECLARE m_begin_row INT DEFAULT 0;
WHILE m_begin_row<p_branch_size DO
/*构造语句*/
SET @MAIN_STRING = CONCAT('CREATE TABLE ', p_table_name, '_', LPAD(m_begin_row, p_lpad, 0), '(', p_field_list ,')ENGINE=InnoDB DEFAULT CHARSET=utf8;');
/*预处理*/
PREPARE main_stmt FROM @MAIN_STRING;
EXECUTE main_stmt;
SET m_begin_row=m_begin_row+1;
END WHILE;
END;
前期没有分表数据量太大后期拆表用的MySQL存储过程
简单的办法是直接写
--假设根据user_id分表,分成64张
insert into table_new_0000 select * from table_old where mod(user_id,64)=0;
insert into table_new_0001 select * from table_old where mod(user_id,64)=1;
一共64条sql,OK 搞定。但是这个一张表被全表扫描了64次,做的无用功比较多,而且导致停机时间比较长
创建分表
delimeter //
--- 全量脚本:
CREATE PROCEDURE sp_xf_move_item()
begin
declare v_exit int default 0;
declare v_spid bigint;
declare v_id bigint;
declare i int default 0;
declare c_table int;
--定义游标(要分拆的表,定义一个数量的截止时间)
declare c_ids cursor for select id,user_id from item_records_0000 where gmt_modified < '2010-8-25 00:00:00';
declare continue handler for not found set v_exit=1;
open c_ids;
repeat
--将需要的值装入变量
fetch c_ids into v_id,v_spid;
if v_exit = 0 then
set @vv_id = v_id;
--根据取模字段获取数据存在的表
select mod(v_spid,64) into c_table;
--组装动态sql
SET @SQL_CONTEXT =
CONCAT('insert into item_record_',
LPAD(c_table, 4, 0),
' select * from item_records_0000 where id = ?');
PREPARE STMT FROM @SQL_CONTEXT;
--执行sql
EXECUTE STMT using @vv_id;
DEALLOCATE PREPARE STMT;
end if;
set ii=i+1;
--100条提交一次,以提高效率,记得执行存储过程前设置auto_commit
if mod(i,100)=0 then commit;
end if;
until v_exit=1
end repeat;
close c_ids;
commit;
end;
//
set auto_commit=0;
call sp_xf_move_item();
添加数据
#### 增量脚本 ######
CREATE PROCEDURE sp_xf_add_item()
begin
declare v_exit int default 0;
declare v_spid bigint;
declare v_id bigint;
declare i int default 0;
declare c_table int;
declare c_ids cursor for select id,supplier_id from item_records_0000 where gmt_modified >= '2010-8-25 00:00:00';
declare continue handler for not found set v_exit=1;
open c_ids;
repeat
fetch c_ids into v_id,v_spid;
if v_exit = 0 then
set @vv_id = v_id;
set @v_row=0;
select mod(v_spid,64) into c_table;
--判断数据是否已经存在
SET @SQL_C =
CONCAT('select count(*) into @v_row from item_record_',
LPAD(c_table, 4, 0),
' where id = ?');
PREPARE STMT_C FROM @SQL_C;
EXECUTE STMT_C using @vv_id;
DEALLOCATE PREPARE STMT_C;
SET @SQL_INSERT =
CONCAT('insert into bbc_item_record_',
LPAD(c_table, 4, 0),
' select * from item_records_0000 where id = ?');
PREPARE STMT_I FROM @SQL_INSERT;
SET @SQL_DELETE =
CONCAT('DELETE FROM bbc_item_record_',
LPAD(c_table, 4, 0),
' where id = ?');
PREPARE STMT_D FROM @SQL_DELETE;
--如果数据已经存在,则先delete在insert
if @v_row>0 then
EXECUTE STMT_D using @vv_id;
DEALLOCATE PREPARE STMT_D;
end if;
EXECUTE STMT_I using @vv_id;
DEALLOCATE PREPARE STMT_I;
end if;
set ii=i+1;
if mod(i,100)=0 then commit;
end if;
until v_exit=1
end repeat;
close c_ids;
commit;
end;
//
call sp_xf_add_item()
分享到:
相关推荐
分表分库是指将一个大型表分割成多个小表,每个小表都有其自己的结构和存储空间,以提高查询和写入性能。FreeSql.Repository 库支持分表分库,使用 GuidRepository 类可以实现分表分库,例如: ``` var ...
例如,`common-db-route`可能是一个通用的数据库路由模块,它负责根据业务逻辑和分库分表策略,将SQL语句路由到正确的数据库和表上。`db-route-demo`可能是这个路由机制的示例代码,展示了如何在实际项目中实现数据...
Mycat通过分库分表技术,将大数据量分割到多个小表中,分散存储于不同的数据库服务器,从而提高查询效率。 #### 三、Mycat的工作原理 Mycat的核心工作原理在于“拦截”和“路由”。当接收到用户的SQL请求时,Mycat...
**数据库分库分表(Sharding)**是一种常见的数据库优化技术,主要用于解决大规模数据存储和高并发访问带来的性能瓶颈问题。它通过将单一数据库中的数据分散到多个数据库或表中,从而提高系统的整体性能和可扩展性。...
在实际应用中,这样的存储过程可能用于生成每日报告表、临时工作表或者根据日期范围进行分表。通过传入不同的前缀,我们可以创建不同类型的表,例如日志表、统计表等。 总之,MySQL存储过程允许我们动态地处理表名...
虽然实现简单,不占用带宽,但在数据迁移时可能影响性能,且生成的ID无序、不利于存储和查询。 2. Snowflake算法:Twitter开源的分布式ID生成器,它结合了时间戳、机器ID和序列号,确保生成的ID全局唯一且大部分...
在分库分表场景下,MySQL可以通过InnoDB存储引擎支持行级锁定,提高并发性能。此外,MySQL的分区功能也可以辅助分库分表,但Sharding-JDBC通常会提供更高级的分片策略和管理。 **项目结构与实现** "mybatis-plus-...
4. 数据路由模块:根据请求中的参数,确定数据应该存储或查询哪个分库分表。 5. 锁管理器:实现了获取和释放分布式Redis锁的逻辑,确保并发操作的安全性。 6. 可能还会有日志记录、异常处理、配置管理等通用功能。 ...
反之,如果数据量大,且对数据一致性要求高,或者经常需要单独操作某一级别的信息,那么分表存储可能更为合适。 在Java开发中,使用这些数据库设计时,可以利用JDBC进行数据库操作,或者使用ORM框架如Hibernate或...
在DB存储需求中,尽管业务不同,技术难点还是类似的,开源世界有很多DB中间件,解决方案也以通用方案为主,满足业务需要为前提,支持各种类型的需求。 Oceanus致力于打造一个功能简单、可依赖、易于上手、易于扩展...
### 一种通用的生成序列的方法:深入解析与应用 #### 技术背景 在数据库管理中,序列(sequence)作为自动生成唯一标识符的关键技术,广泛应用于为表中的行分配唯一的主键值。传统上,各大数据库供应商如Oracle、...
- `id`: 自增ID,用于分表,确保每个应用的日志存储在单独的表中。 - `appName`: 应用名称,用于显示。 - `secureCode`: 接入密码,用于验证客户端身份。 - `description`: 描述信息。 - `recordsCount`: 日志记录...
分表插件则是为了处理大数据场景下的性能问题,通过将大表拆分成多个小表来分散数据存储,提高查询速度。这样的插件通常会包含自动分片策略、事务管理、查询路由等功能。开发者需要理解数据库分片的基本原理,以及...
这个“通用运动会代表队得分总表excel模版下载”提供了一个实用的工具,帮助赛事组织者清晰、高效地跟踪和汇总各队的比赛成绩。Excel作为一款强大的电子表格软件,因其强大的数据处理和分析功能,成为制作此类模板的...
提供强大的元信息机制,开发者可以使用通用和自定义的元信息机制实现定义资源属性。超大的容量。云存储支持从 0-2T 的单文件数据容量,同时对于 object 的个数没有限制。利用云存储的 superfile 接口可以实现 2T ...
同时,对于大数据量的场景,可能需要引入数据库分库分表、读写分离等策略。 总的来说,EXTJS+Java+MySQL的组合,为开发复杂的企业级后台管理系统提供了一种高效、灵活的解决方案。开发者可以利用这套框架快速构建出...
zxframe的demo ZxFrame为JAVA框架-支持JPA,多级缓存,读写分离,分库分表;支持通用分布式锁;...封装本地和远程任意缓存存储,使用极其简单,支持对缓存组删除 -->zxframe.cache.mgr.CacheManager
指出了这些方案在功能、可扩展性、事务支持、跨机房操作和宕机恢复等方面的不足,进而引出OceanBase作为淘宝自主研发的通用存储系统的优势和必要性。OceanBase旨在解决海量数据的事务处理、大表Join问题,以及提供更...
随着业务逻辑复杂化和订单量增长迅猛,微服务化、分库分表、SET化等技术应用而生。最后,为了适应多品类、多业务的需要,发展到平台化阶段,目标是构建一套通用、可配置、易扩展的订单平台。 在介绍订单平台化整体...
- **存储过程**:尽管可以简化业务代码,但在频繁变更的互联网环境中,存储过程的升级和调试可能变得复杂。 - **视图**:视图可以简化SQL,但可能牺牲性能,应权衡视图的通用性和性能需求。 遵循以上规范,开发者...