MyBatis如何实现Mysql数据库分库分表的实例详解
这篇文章主要介绍了MyBatis实现Mysql数据库分库分表操作和总结,需要的朋友可以参考下
前言
作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步。这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了。
MyBatis实现分表最简单步骤
既然文章的标题都这么写了,不如直接上干货来的比较实际,我们就先来看看如何实现最简单的分表。
1、我们模拟用户表数据量超过千万(虽然实际不太可能)
2、用户表原来的名字叫做user_tab
,我们切分为user_tab_0
和user_tab_1
(实际也可能不是这么随意的名字),这样就能把原来千万的数据分离成两个百万的数据量的两张表了。
3、如何操作这两张表呢?我们利用userId也就是用户的唯一标识进行区分。
4、userId%2 == 0
的用户操作表user_tab_0
,同理userId%2 == 1
的用户操作表user_tab_1
5、那么在MyBatis中sql语句如何实现呢?下面是举例查询一个用户的sql语句
<select id="getUser" parameterType="java.util.Map" resultType="UserDO"> SELECT userId, name FROM user_tab_#{tabIndex} WHERE userId = #{userId} </select>
其中我们传入了两个参数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成本,即可上手,而且比较容易控制,就如同最上面给出的例子一样,而且当前我处理的数据还没有到达那种处处要分离的地步,所以我选择第一种。也推荐使用。如果你找到比较好用的插件或者中间件也可以在评论中推荐。
总结
在实际项目中,我是因为用户的账户记录过多所以不得不进行分离,而且因为账户记录更多的只是新增没有修改和删除,查询也是少数,所以使用了最简单的方式进行分离,也选择了最简单的策略。希望上面的原则策略方式和问题的总结能对你有所帮助,有所参考。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
以上是MyBatis如何实现Mysql数据库分库分表的实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

直接从数据库中恢复被删除的行通常是不可能的,除非有备份或事务回滚机制。关键点:事务回滚:在事务未提交前执行ROLLBACK可恢复数据。备份:定期备份数据库可用于快速恢复数据。数据库快照:可创建数据库只读副本,在数据误删后恢复数据。慎用DELETE语句:仔细检查条件,避免误删数据。使用WHERE子句:明确指定要删除的数据。使用测试环境:在执行DELETE操作前进行测试。

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen
