MySQL分库分表怎么操作

参考答案

一、MySQL分库分表的原因

随着用户的增多,当数据量大到一定程度,仅一张表的数据可能就超过千万时,执行查询或修改等操作就比较耗时,这时就需要进行数据库切分的操作。

二、MySQL分库分表的方式

1.  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. 分离的方式

切分的方式主要有两种:

1)  水平切分

把一张表分离成几张一模一样的表,然后表的名字不同(同上面示例)。

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

2)  垂直切分

把不同的业务模块分成不同的数据库,这些业务模块直接最好是0耦合。

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

 

2. 分离的策略

具体的策略有很多种,普遍采用的策略有以下几种,此处只列举就不具体展开了。

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

2) MD5哈希

3) 移位

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

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

 

3. 分离的问题

以下是几个分离会导致的问题。

1) 添加时主键唯一性的问题,分离之后多张表,会导致原有的自增长主键不唯一,所以没有办法自增长了。

2) 新增时的效率问题(可忽略不计)。

3) 查询所带来的分页问题,分离成多张表之后,分页查询就很困难了。

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

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

6) 扩展性问题,有的切分策略,对数据的扩展性不好。

4. 分离的原则

分离原则总结如下:

1)能不分就不分。

2)能分少就不分多。

3)多冗余,不关联。

4)避免使用分布式事务。

5)单表千万记录以内的不分。

6)现在不分,以后分也来得及。

5. 实现分离的方式

分离的实现主要有下面几种方式:

1) 原生实现

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

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

2)插件实现

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

  • 优点:代码量少,实现简单,扩展性好。
  • 缺点:不易控制,分离方式有限,出现问题难以解决。没有找到特别成熟的插件。

3)中间件实现

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

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

缺点:实现比较复杂,成本较大。

 

我是因为在实际项目中,用户的账户记录过多,而不得不进行分离,且账户记录更多的只是新增,没有修改和删除,查询也是少数,考虑实现成本,选择了第一种最简单的方式进行分离,上手快且比较容易控制。

选择何种分离方式,还是要依据业务场景来定。

 

以上,是MySQL面试题【MySQL分库分表怎么操作】的参考答案。

输出,是最好的学习方法

欢迎在评论区留下你的问题、笔记或知识点补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧