分表 -- mysql create table 问题

前一段时间公司一个任务分发中心的项目需要分表,这个任务落到了我和另外一个同事兼好朋友的肩上。
整个项目的流程大概是这个样子的。
运营人员在后台建立一个任务,将该任务发布,平台的用户可以参加该任务。由于前期用户量不大,作为主要表的任务表和用户表仅仅建了两个,后期随着用户和任务量的不断增加,导致查询效率急剧下滑,所以商讨后决定做分表。
开始我们俩人做了商讨,商讨结果如下
分表 -- mysql create table 问题

最终决定在用户维度和任务维度进行分表。
用户维度:
将用户平均分散到20张表中,如果要根据用户id查询,先根据user id查询到该用户所在的表,再从该张表中查询相关数据,用分表的方式来减少数据库压力;
任务维度:
每50个连续的任务存放到同一张表中,如果要根据任务id查询,先根据任务id查询到该任务所在的表, 再从该表中查询相关数据,减少数据库压力;

我们的第一套方案(第一次代码)是当拿到用户id或者任务id的时候 先用
SHOW TABLES LIKE [tablename] 查询该表是否存在;
再用create table 动态创建表。
一套成下来是在一个事务里边的。
测试的时候走的都是正常流程,没有出现什么问题。
上线之后,发现分表这块儿经常出错,本来是同一个事务,结果是失败的情况下,回滚了一半。
郁闷了, 后来还是公司的架构师大牛检查了一下代码, 提出了看法。create table 和 show tables like 都会有隐式提交的问题。
也就是说在执行create table 或者 show tables 的之前会执行commit;
懂了吗?明白了吗?
问题就在这里。

后来查了资料确实是。
mysql官方文档一部分https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html

分表 -- mysql create table 问题
这段已经说明了。
感觉自己功力还是太浅啊!
后来我们实施第二套方案:
由于用户维度共20张表, 所以在项目启动的时候直接创建20张表,任务维度的检查表是否存在放到创建任务的时候,而且一定要保证create table 和 show tables 操作不和业务逻辑在一个事务中
这个问题算是解决了。涨姿势了。

如果觉得文章真心好, 请打赏下我吧http://blog.csdn.net/assassinsshadow/article/details/76086401