热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MyBatis实现Mysql数据库分库分表操作和总结(推荐)

这篇文章主要介绍了MyBatis实现Mysql数据库分库分表操作和总结,需要的朋友可以参考下

前言

作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步。这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了。

MyBatis实现分表最简单步骤

既然文章的标题都这么写了,不如直接上干货来的比较实际,我们就先来看看如何实现最简单的分表。

1、我们模拟用户表数据量超过千万(虽然实际不太可能)

2、用户表原来的名字叫做user_tab,我们切分为user_tab_0user_tab_1(实际也可能不是这么随意的名字),这样就能把原来千万的数据分离成两个百万的数据量的两张表了。

3、如何操作这两张表呢?我们利用userId也就是用户的唯一标识进行区分。

4、userId%2 == 0的用户操作表user_tab_0,同理userId%2 == 1的用户操作表user_tab_1

5、那么在MyBatis中sql语句如何实现呢?下面是举例查询一个用户的sql语句

其中我们传入了两个参数tabIndex和userId,tabIndex就是需要操作表的标示值(0或1),这样如果需要查询userId为5的用户,那么最终出现的sql语句就会是:

SELECT userId, name 
FROM user_tab_1 
WHERE userId = 5

其他多余的DAO服务和实现我这里就不多展示了,相信聪明的你肯定会的。

以上就是最简单的实现,不需要多余的框架,不需要任何的插件也就满足了分表的要求。

上面基本上就是所有实现的内容了,下面就要开始详细说说分离的细节了,看热闹的基本可以散了。

我将从下面几个角度分别来说说。我尽可能用最简单的白话来说。

分离的方式

切分的方式主要有两种,水平切分和垂直切分。

1、水平切分

简单的说就是,把一张表分离成几张一模一样的表,然后表的名字不同。就和上面最简单的例子一样。

这种切分适合于一张表的数据量过大而导致操作时间变慢的情况,如保存的一些记录表。

2、垂直切分

把不同的业务模块分成不同的数据库,这些业务模块直接最好是0耦合(简单的说就是毫无关系)。

这主要是适合数据量普遍较大,而且业务场景比较分散,互相之间没有逻辑关系的情况。

分离的策略

具体的策略有很多种,你也可以设计你自己的,普遍的策略有下面几种,只是列举就不具体展开了。

1、“%”取模,也就是上面例子中实现的,也是最简单的一种。

2、MD5哈希

3、移位

4、日期时间(根据不同的日期分表,如一个月一张表,这个月就操作这张表,下个月就下张表)

5、枚举范围(用户1-10000操作第一张表,用户10001-20000操作第二张表)

分离的问题

下面说说最终要的点,导致的问题。

数据库肯定不是你说分就分的。(人家比较有感情的,怎么能说分就分呢?)

正经来说,我列举了下面几个分离只有会导致的问题。

1、添加时主键唯一性的问题;分离之后多张表,就会导致原有的自增长主键不唯一,所以没有办法自增长了,导致问题,解决方案的也是有的,比如单独维护一张主键表专门用来存放当前主键,或者说用别的中间件等。

2、新增时的效率问题,虽然不是个大问题,但是新增肯定会多了计算量嘛,这个问题可以忽略不计。

3、查询所带来的分页问题,分离成多张表之后,分页查询就很困难了,这也考虑到不同的分离用不同的解决方案,总之会产生问题。

4、同理,关联查询,原本一张表关联别的表或者别的表关联一张表,都很简单,但是现在分离之后就难了。

5、事务问题,多张表需要使用分布式事务才能完成原来带有事务的操作。因为原来的事务只是锁一张表现在可能要锁多张了呢。

6、扩展性问题,有的切分策略下,对数据的扩展性其实不好,之后如果有更多的数据来了,是说还能再新建表来扩展吗?

分离的原则

下面总结了几点分离的原则,主要是参考了网络上的,没有任何实际的依据(我也不是个年薪百万的DBA也碰不到那么大的数据去实际检验嘛),所以如果有任何问题也请指出。

1、能不分就不分

2、能分少就不分多

3、多冗余,不关联

4、避免使用分布式事务,主要是太难我也不会啊

5、单表千万记录以内就不分

6、现在不分以后分也来得及

7、扩展,耦合,仔细考虑

实现分离的方式

最后说说分离的方式,现在流行使用的DAO框架是MyBatis,也有很多别的框架。分离的实现主要有下面几种方式。

1、原生实现,就和最上面的例子一样,不需要其他任何的东西,利用原生的框架,自己去控制实现。

优点是:容易控制,掌握主动权。

缺点是:代码量多,需要自己很清楚,修改不方便,不支持复杂的切分,比如切分之后还需要做一些分页查询,还有上面说的主键问题等。

2、插件实现,利用框架本身开发的一些插件,去实现这些插件,然后利用插件去访问数据库,直接实现分离。

优点是:代码量少,实现简单,扩展性好。

缺点是:不易控制,分离方式有限,出现问题难以解决。没有找到特别成熟的插件。

3、中间件实现。利用一些数据库访问的中间件,在访问数据库之前做一些操作使得sql进行相应的变化从而实现分离。

优点是:耦合小,扩展性好,可以解决分布式事务的问题。

确定是:实现比较复杂,需要对中间件进行学习,成本较大。维护也是一个大问题,万一挂掉了。。

总之方式各有千秋,但是考虑到成本上面,第一种几乎是0成本,即可上手,而且比较容易控制,就如同最上面给出的例子一样,而且当前我处理的数据还没有到达那种处处要分离的地步,所以我选择第一种。也推荐使用。如果你找到比较好用的插件或者中间件也可以在评论中推荐。

总结

在实际项目中,我是因为用户的账户记录过多所以不得不进行分离,而且因为账户记录更多的只是新增没有修改和删除,查询也是少数,所以使用了最简单的方式进行分离,也选择了最简单的策略。希望上面的原则策略方式和问题的总结能对你有所帮助,有所参考。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • PGXC中的两阶段提交机制及其对事务一致性的保障
    PGXC作为一款基于PostgreSQL的分布式数据库系统,利用Sharding技术将数据分散存储于多个数据库实例中。本文探讨了PGXC的两阶段提交过程及其实现事务强一致性的方法。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文探讨了服务化的目标,包括将系统中的独立业务模块垂直划分,形成基础服务层,以及如何通过无状态的基础服务支持上游业务。同时,文章详细讨论了服务子系统的数量控制和划分注意事项,以确保系统的高效性和可维护性。 ... [详细]
  • 8个IDC大数据基础定义解析丨IDC
    本文针对IDC数据行业相关名词术语进行解析,分为4组相关概念,希望大家读完 ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • 本文探讨了一种统一的语义数据模型,旨在支持物联网、建筑及企业环境下的数据转换。该模型强调简洁性和可扩展性,以促进不同行业间的插件化和互操作性。对于智能硬件开发者而言,这一模型提供了重要的参考价值。 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 近年来,区块链技术备受关注,其中比特币(Bitcoin)功不可没。尽管数字货币的概念早在上个世纪就被提出,但直到比特币的诞生,这一概念才真正落地生根。本文将详细探讨比特币、以太坊和超级账本(Hyperledger)的核心技术和应用场景。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • 本文介绍了Hadoop的核心组件,包括高可靠性和高吞吐量的分布式文件系统HDFS、分布式的离线并行计算框架MapReduce、作业调度与集群资源管理框架YARN以及支持其他模块的工具模块Common。 ... [详细]
author-avatar
残破的前进
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有