数据库|面试官:说说MySQL数据库分库分表,并且会有哪些问题?( 二 )



3、搞一张表来存储路由关系 还是拿用户表来说 , 就是弄一个路由表 , 里面存userId和表编号 , 表示这个userId是这张user表的的 。 这种方式也简单 , 之后又要分表了之后改改路由表 , 迁移一部分数据 。 但是这种方法导致每次查询都得查两次 , 并且如果路由表太大了 , 那路由表又成为瓶颈了!
再说说查询时候的问题 。
比如你要查注册时间最早的前100名用户 , 这就等于你得在水平分的每一张表都order by 一下注册时间并且取100个 , 然后再把每个表的100个结果对比一下得到最终的结果 。 首先操作变麻烦了 , 以前一个order by就搞定的事情现在变的复杂了 , 而且还得考虑一个因素就是时间的问题 , 如果你拆成了20个表 , 那你得执行20个order by , 如果是串行执行的话 , 这个时间开销也是个问题!
分库分表的实现
具体实现也分为程序代码封装、数据库中间件封装 。 实现难度会比读写分离更大 , 至于两种封装的比较在讲读写分离时候已经说了 , 这里不再赘述 。
总结
说了这么多好像分库分表一点都不好啊 , 没错会引入很多问题 , 所以在架构设计要遵循演化原则 , 任何东西都不是一蹴而就的 , 在不同场景适配不同的架构 , 架构只有合适的 , 没有一个架构可以适配任何场景 。
在软件中简单够用就是好的 , 技术没有贵贱 , 不是用了分布式就牛逼 , 越复杂的系统维护的成本和难度越高 , 出现问题的几率越大 。 这种架构的演化往往都是被用户所驱动的 , 可以说是""不得已而为之"" 。
基本上单机数据库可以支撑10万用户量级别 。 所以一般情况下像数据库吃不消就升级硬件 , 优化数据库配置、优化代码、引入redis等 。 只有在真的不行了才上这些更复杂的东西 。


推荐阅读