mysql大数据解决方案--分区分表分库

这篇文章主要介绍了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实现分表,取模的形式

  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语句

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值