`
hudeyong926
  • 浏览: 2034821 次
  • 来自: 武汉
社区版块
存档分类
最新评论

通用分表存储过程

 
阅读更多

使用创建分表存储过程

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()
分享到:
评论

相关推荐

    【ASP.NET编程知识】.NET Core实现分表分库、读写分离的通用 Repository功能.docx

    分表分库是指将一个大型表分割成多个小表,每个小表都有其自己的结构和存储空间,以提高查询和写入性能。FreeSql.Repository 库支持分表分库,使用 GuidRepository 类可以实现分表分库,例如: ``` var ...

    数据库分库分表

    例如,`common-db-route`可能是一个通用的数据库路由模块,它负责根据业务逻辑和分库分表策略,将SQL语句路由到正确的数据库和表上。`db-route-demo`可能是这个路由机制的示例代码,展示了如何在实际项目中实现数据...

    Mycat读写分离、主从切换、分库分表的操作记录- 线上操作手册

    Mycat通过分库分表技术,将大数据量分割到多个小表中,分散存储于不同的数据库服务器,从而提高查询效率。 #### 三、Mycat的工作原理 Mycat的核心工作原理在于“拦截”和“路由”。当接收到用户的SQL请求时,Mycat...

    数据库分库分表(sharding)的技术

    **数据库分库分表(Sharding)**是一种常见的数据库优化技术,主要用于解决大规模数据存储和高并发访问带来的性能瓶颈问题。它通过将单一数据库中的数据分散到多个数据库或表中,从而提高系统的整体性能和可扩展性。...

    深入mysql存储过程中表名使用参数传入的详解

    在实际应用中,这样的存储过程可能用于生成每日报告表、临时工作表或者根据日期范围进行分表。通过传入不同的前缀,我们可以创建不同类型的表,例如日志表、统计表等。 总之,MySQL存储过程允许我们动态地处理表名...

    第六节课交易分库分表详解二1

    虽然实现简单,不占用带宽,但在数据迁移时可能影响性能,且生成的ID无序、不利于存储和查询。 2. Snowflake算法:Twitter开源的分布式ID生成器,它结合了时间戳、机器ID和序列号,确保生成的ID全局唯一且大部分...

    基于mybatis-plus+sharding+mysql的分库分表项目源码.zip

    在分库分表场景下,MySQL可以通过InnoDB存储引擎支持行级锁定,提高并发性能。此外,MySQL的分区功能也可以辅助分库分表,但Sharding-JDBC通常会提供更高级的分片策略和管理。 **项目结构与实现** "mybatis-plus-...

    基于Flask框架实现 (源代码已加密,有兴趣学习可联系我) 分布式Redis锁 分库分表分区中间-pytide.zip

    4. 数据路由模块:根据请求中的参数,确定数据应该存储或查询哪个分库分表。 5. 锁管理器:实现了获取和释放分布式Redis锁的逻辑,确保并发操作的安全性。 6. 可能还会有日志记录、异常处理、配置管理等通用功能。 ...

    JSOUP 一张表存储省市区街道四级地址信息,主键用UUID存储, 还有一种是用四张表分别存取 省 市 区 街道四级 可以作为参

    反之,如果数据量大,且对数据一致性要求高,或者经常需要单独操作某一级别的信息,那么分表存储可能更为合适。 在Java开发中,使用这些数据库设计时,可以利用JDBC进行数据库操作,或者使用ORM框架如Hibernate或...

    58同城数据库中间件-58同城数据库中间件

    在DB存储需求中,尽管业务不同,技术难点还是类似的,开源世界有很多DB中间件,解决方案也以通用方案为主,满足业务需要为前提,支持各种类型的需求。 Oceanus致力于打造一个功能简单、可依赖、易于上手、易于扩展...

    一种通用的生成序列的方法

    ### 一种通用的生成序列的方法:深入解析与应用 #### 技术背景 在数据库管理中,序列(sequence)作为自动生成唯一标识符的关键技术,广泛应用于为表中的行分配唯一的主键值。传统上,各大数据库供应商如Oracle、...

    真正通用的操作日志系统设计

    - `id`: 自增ID,用于分表,确保每个应用的日志存储在单独的表中。 - `appName`: 应用名称,用于显示。 - `secureCode`: 接入密码,用于验证客户端身份。 - `description`: 描述信息。 - `recordsCount`: 日志记录...

    个人整理的好用工具类

    分表插件则是为了处理大数据场景下的性能问题,通过将大表拆分成多个小表来分散数据存储,提高查询速度。这样的插件通常会包含自动分片策略、事务管理、查询路由等功能。开发者需要理解数据库分片的基本原理,以及...

    通用运动会代表队得分总表excel模版下载

    这个“通用运动会代表队得分总表excel模版下载”提供了一个实用的工具,帮助赛事组织者清晰、高效地跟踪和汇总各队的比赛成绩。Excel作为一款强大的电子表格软件,因其强大的数据处理和分析功能,成为制作此类模板的...

    云存储 应用.docx

    提供强大的元信息机制,开发者可以使用通用和自定义的元信息机制实现定义资源属性。超大的容量。云存储支持从 0-2T 的单文件数据容量,同时对于 object 的个数没有限制。利用云存储的 superfile 接口可以实现 2T ...

    extjs+java+mysql通用后台管理

    同时,对于大数据量的场景,可能需要引入数据库分库分表、读写分离等策略。 总的来说,EXTJS+Java+MySQL的组合,为开发复杂的企业级后台管理系统提供了一种高效、灵活的解决方案。开发者可以利用这套框架快速构建出...

    zxframe的demo

    zxframe的demo ZxFrame为JAVA框架-支持JPA,多级缓存,读写分离,分库分表;支持通用分布式锁;...封装本地和远程任意缓存存储,使用极其简单,支持对缓存组删除 --&gt;zxframe.cache.mgr.CacheManager

    淘宝OceanBase云存储实践

    指出了这些方案在功能、可扩展性、事务支持、跨机房操作和宕机恢复等方面的不足,进而引出OceanBase作为淘宝自主研发的通用存储系统的优势和必要性。OceanBase旨在解决海量数据的事务处理、大表Join问题,以及提供更...

    《订单交易平台化建设实践》.pdf

    随着业务逻辑复杂化和订单量增长迅猛,微服务化、分库分表、SET化等技术应用而生。最后,为了适应多品类、多业务的需要,发展到平台化阶段,目标是构建一套通用、可配置、易扩展的订单平台。 在介绍订单平台化整体...

    MySQL开发规范.docx

    - **存储过程**:尽管可以简化业务代码,但在频繁变更的互联网环境中,存储过程的升级和调试可能变得复杂。 - **视图**:视图可以简化SQL,但可能牺牲性能,应权衡视图的通用性和性能需求。 遵循以上规范,开发者...

Global site tag (gtag.js) - Google Analytics