`

MySql分表

 
阅读更多

       如果设计的并发搞,数据量大我们考虑做myslq分表处理mysql分表依据不同的维度。比如有活动和用户的关系表,如果不分表,在单表里就可查到一个用户创建了多少个活动,一个活动下有多少个参与者。如果要分表就需要两个维度来考虑,第一以用户ID分表  第二:以活动ID分表,如果是活动表,那个就以活动ID分表维度。

       分表大多少看具体业务而定,一般是以100为基数,可以参考的标准是如果数据结构简单可以1000-2000W作为分表的依据,如果设计信息多可以以500-1000W作为参考值。

        

       分表采用的算法:1.分表的维度对应的值求余所得到值作为表的后缀  2.用Hash值,以及其他算法来实现

 

       示例说明:

       表结构:

/*DDL 信息*/------------

CREATE TABLE `card_activity_ref` (
  `ref_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `card_id` bigint(20) DEFAULT NULL COMMENT '名片ID',
  `activity_id` bigint(20) DEFAULT NULL COMMENT '活动ID',
  `create_time` bigint(20) NOT NULL COMMENT '创建时间',
  `update_time` bigint(20) NOT NULL COMMENT '更新时间',
  `is_del` tinyint(4) DEFAULT '0' COMMENT '是否删除 0 未删除 1 删除',
  `card_type` tinyint(4) DEFAULT '1' COMMENT '名片类型(1 个人名片 2 组织名片 3 成员名片)',
  PRIMARY KEY (`ref_id`),
  KEY `card_ref_select_1` (`is_del`,`card_id`,`update_time`)
) E

 

 

    采用的环境:springMVC+Mybatis+mysql

    1.java对象的代码- 按照CardId作为分表的维度,分50张表

   

    public String getCardRefTablePostfix(){
        if(cardId == null){
            return null;
        }
        return String.valueOf(cardId % 50);
    }

 

 

  2.在mybatis配置文件中的配置为,完整表明是 card_activity_ref_1、${cardRefTablePostfix}这个是动态输出,值是算出的一个值

 

	<update id="update" parameterType="cardActivityRef">
		update card_activity_ref_${cardRefTablePostfix}
		<set>
		    update_time = #{updateTime}
 			<if test="isDel != null">,is_del=#{isDel}</if>
  	     </set>
		 <where>
				ref_id = #{refId};
		 </where>	
	</update>

 3.mysql分表后表为:

 

D
ELIMITER $$

USE `syswin_activity`$$

DROP PROCEDURE IF EXISTS `del_cardRef_pro`$$

CREATE DEFINER=`syswin`@`%` PROCEDURE `del_cardRef_pro`()
BEGIN
    DECLARE i INT;
SET i=0;
WHILE i<50 DO
 SET @sql = CONCAT("DROP TABLE `card_activity_ref_",i,"`");
PREPARE s FROM @sql;
EXECUTE s;
SET i=i+1;
 
END WHILE;
    END$$

DELIMITER ;

 card_activity_ref_1

card_activity_ref_2

card_activity_ref_3···

 

是不是觉着很简单就实现了分表。最主要的就是生成表的后缀的,可以单独提供一个方法来获取表的后缀,或者直接在实体中计算如上。

 

最后附上分表的sql为:

 

DELIMITER $$

USE `syswin_activity`$$

DROP PROCEDURE IF EXISTS `batch_i_cardRef_pro`$$

CREATE DEFINER=`syswin`@`%` PROCEDURE `batch_i_cardRef_pro`()
BEGIN
    DECLARE i INT;
SET i=0;
WHILE i<50 DO
 SET @sql = CONCAT("CREATE TABLE `card_activity_ref_",i,"` (
  `ref_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `card_id` bigint(20) DEFAULT NULL COMMENT '名片ID',
  `card_type` tinyint(4) DEFAULT '1' COMMENT '名片类型(1 个人名片 2 组织名片 3 成员名片)',
  `activity_id` bigint(20) DEFAULT NULL COMMENT '活动ID',
  `is_del` tinyint(4) DEFAULT '0' COMMENT '是否删除 0 未删除 1 删除',
  `create_time` bigint(20) NOT NULL COMMENT '创建时间',
  `update_time` bigint(20) NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`ref_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8");
PREPARE s FROM @sql;
EXECUTE s;
SET i=i+1;
END WHILE;
    END$$

DELIMITER ;

 

 

 

 

 

分享到:
评论

相关推荐

    MySQL分表及分表后插入sql

    MySQL分表及分表后插入sql语句,表为订单表,可以参考一下

    Node.js 实现的 MySQL 分表分库中间件,用于海量数据的分布式集群储存管理和高并发访问。.zip

    本文将深入探讨基于Node.js实现的MySQL分表分库中间件,它在分布式集群环境中起到至关重要的作用。 首先,Node.js是一种流行的JavaScript运行环境,它允许开发人员使用JavaScript进行服务器端编程。Node.js的异步非...

    mysql分表分库demo

    MySQL 分表分库 Demo MySQL 分表分库是指将大型数据库表分割成多个小表,以提高数据库的性能和可扩展性。随着业务数据的增长,数据库表中的数据不断增加,如果不加以控制,数据库的性能将会下降,影响业务的发展。 ...

    MySQL分表和分区最佳攻略word

    MySQL分表和分区最佳攻略 word版本,

    Python与MySQL分表分库实战

    本篇文章将深入探讨"Python与MySQL分表分库实战"这一主题,帮助你理解如何有效地利用这两种技术来优化数据库性能和处理大数据。 首先,我们需要理解“分表分库”这一概念。随着数据量的增长,单一数据库可能会面临...

    Python+MySQL分表分库实战

    "Python+MySQL分表分库实战"的主题,正是探讨如何结合这两者,以解决大数据存储和查询中的挑战。 分表分库,也称为数据库水平扩展,是应对海量数据的常用策略。当单个数据库表的数据量过大时,会导致查询效率降低,...

    mysql 分表

    关于mysql的分表技术实现方法。以及分表设计, 及简单的代码实例。

    MySQL分表和分区最佳攻略

    常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致...分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

    mysql分表创建

    文件`mysql分表创建.sql`很可能包含了创建分表的SQL脚本,如创建新表、插入数据、设置分区等操作。具体操作时,应确保理解分表策略,合理选择分片键,避免数据热点,并测试分表后的查询性能。 总之,MySQL分表是...

    Mysql分表查询,哈希,范围,列表

    【MySQL分表查询】在大型数据库系统中,随着数据量的不断增长,单表的数据规模可能会变得非常庞大,导致查询效率下降,系统性能受到影响。此时,分表技术就显得尤为重要。MySQL提供了多种分表策略,如哈希分表、范围...

    基于hibernate的mysql分表分库实例-mysql-cluster-hibernate.zip

    "基于hibernate的mysql分表分库实例-mysql-cluster-hibernate.zip"这个压缩包文件提供了一个具体的解决方案,它涉及到Hibernate ORM框架与MySQL数据库集群的整合,旨在处理高并发、大数据量的业务场景。 **...

    Mysql分表分库-core-dbshard2.zip

    "Mysql分表分库-core-dbshard2.zip" 文件可能包含了一个名为 "core-dbshard2-master" 的项目,这个项目很可能是关于MySQL数据库分库分表的实现方案或工具。 分库分表是一种水平扩展(Scaling Out)的方式,当单个...

    mysql分表分库-mysqlfenbaiofenku.zip

    MySQL 分表分库是数据库优化和扩展的一种策略,主要用于处理大数据量、高并发场景下的数据库性能问题。在大型互联网应用中,随着用户数量和数据规模的增长,单个数据库可能无法承受大量的读写操作,这时就需要采取...

    Node.js的MySQL分表分库访问中间件TribeDB.zip

    Node.js 的 MySQL 分表分库数据访问中间件,实现MySQL数据的分布式集群储存管理。在处理海量数据、高并发访问时,获得更加优越的性能及横向扩展能力。它包含以下主要特性: 可伸缩、高扩展的架构 ...

    Python+MySQL分表分库实战 - v1.0 - 运维生存时间 -(2016).mobi

    Python后端运维工程师的可靠参考书,重点介绍如何优化mysql数据库性能。

    MySQL分表实现上百万上千万记录分布存储的批量查询设计模式详解

    本文将深入探讨如何使用MySQL分表实现大规模数据的分布存储和批量查询设计模式。 首先,我们需要理解分表的概念。不同于MySQL 5.1引入的分区(Partitioning)功能,这里所说的分表是手动将一个大表根据特定字段(如...

    MySQL分表自增ID问题的解决方法

    这两种方法都旨在解决MySQL分表后生成唯一ID的挑战。使用Redis生成ID可以提供更好的并发性能,但需要额外的运维成本。在实际应用中,应根据系统需求、资源状况和并发水平选择合适的方法。同时,设计时要考虑扩展性和...

    MySQL分表和分区的具体实现方法

    MySQL数据库在处理大数据量时,可能会遇到性能瓶颈,这时就需要采取一些优化策略,其中分表和分区是常见的解决方案。本文将详细介绍这两种技术及其在MySQL中的具体实现。 **垂直分表**是将一个宽表(包含大量列)...

    mysql分表,分区的区别与联系借鉴.pdf

    MySQL中的分表和分区是两种不同的数据库优化策略,它们旨在管理和优化大数据量的表,以提升查询性能和系统效率。 **分表**是指将一张大表拆分成多个小表,每个小表都拥有完整的表结构,包括.MYD数据文件、.MYI索引...

Global site tag (gtag.js) - Google Analytics