这篇文章主要介绍了MyBatis实现Mysql数据库分库分表操作和总结,需要的朋友可以参考下
前言
作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步。这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了。对于一个大型的互联网应用,海量数据的存储和访问成为了系统设计的瓶颈问题,对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。
•水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失;
•负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性;
•集群方案:解决了数据库宕机带来的单点数据库不能访问的问题;
•读写分离策略:最大限度了提高了应用中读取数据的速度和并发量;
问题描述
1、单个表数据量越大,读写锁,插入操作重新建立索引效率越低。
2、单个库数据量太大(一个数据库数据量到1T-2T就是极限)
3、单个数据库服务器压力过大
4、读写速度遇到瓶颈(并发量几百)
解决问题的思路:根据自己的实际情况,当单表过大的时候进行分表,数据库过大的时候进行分库,高并发的情况考虑读写分离和集群。
数据拆分的方式有:分区、分表、分库
•分区 :就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
•分表 :就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
•分库:就是分成多个数据库实例,每个数据库实例中表名相同
将整个数据库比作图书馆,一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。
什么时候考虑使用分区? | 分区解决的问题 | |
分区 | 1、一张表的查询速度已经慢到影响使用的时候。 2、sql经过优化 3、数据量大 4、表中的数据是分段的 5、对数据的操作往往只涉及一部分数据,而不是所有的数据 |
主要可以提升查询效率 |
分表 | 1、一张表的查询速度已经慢到影响使用的时候。 2、sql经过优化 3、数据量大 4、当频繁插入或者联合查询时,速度变慢 |
1、分表后,单表的并发能力提高了,磁盘I/O性能也提高了,写操作效率提高了 2、查询一次的时间短了 3、数据分布在不同的文件,磁盘I/O性能提高 4、读写锁影响的数据量变小 5、插入数据库需要重新建立索引的数据减少 |
分区和分表的区别与联系
•分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
•分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
•当访问量大,且表数据比较大时,两种方式可以互相配合使用。
•当访问量不大,但表数据比较多时,可以只进行分区。
常见分区分表的规则策略(类似)
1、Range(范围)(用户1-10000操作第一张表,用户10001-20000操作第二张表)
2、Hash(哈希)
3、按照时间拆分 (根据不同的日期分表,如一个月一张表,这个月就操作这张表,下个月就下张表)
4、Hash之后按照分表个数取模 (“%”取模也是最简单的一种) 下面会介绍
5、在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系
例如:这里实现不借助任何插件的形式,用mybatis实现分表,取模的形式
- 我们模拟用户表数据量超过千万(虽然实际不太可能)
- 用户表原来的名字叫做
user_tab
,我们切分为user_tab_0
和user_tab_1
(实际也可能不是这么随意的名字),这样就能把原来千万的数据分离成两个百万的数据量的两张表了。 - 如何操作这两张表呢?我们利用userId也就是用户的唯一标识进行区分。
userId%2 == 0
的用户操作表user_tab_0
,同理userId%2 == 1
的用户操作表user_tab_1
- 那么在MyBatis中sql语句如何实现呢?下面是举例查询一个用户的sql语句