分库设计的几点准则

分库可以将数据库访问的压力分担到多个子库中,提升数据库读写的性能;但数据库一旦分库,上层的读写操作就必须考虑分库这一事实。比如说,要查询某条记录,查询条件除了业务上的条件,还应该把带上一个分库的键值对,好让你的分库框架找到这条记录所在的库。

我根据自己的项目经验稍微归纳一下。

核心准则:尽量让所有的访问都只落在一个分库里。如果要访问多个分库才能完成操作,那么访问性能会由于多次网络I/O而下降,在事务方面也很不方便。

推论

1.
所有的SQL都应该带上分库的键值对,以帮助系统路由到记录所在的分库。比如,你的论坛系统中的帖子是按版面ID分库的,那么在查询某个帖子的详情时也应该把这个贴子所在版面的ID放到SQL里。

2.
被分库表的子表如果需要分库的话,应该按同一维度分库,以保证某主记录的相关子记录跟它总是落在同一个分库中,以方便表连接和事务。 如果帖子是按版面ID分库的,那么一个版面下的所有帖子“赞”记录也都应该跟这个版面下的所有帖子放在同一个分库中; 否则你很难实现“找出某版面下前十个帖子及每个帖子前十个赞贴的人”和“在同一个事务中新增一条评论记录并且将帖子的评论数加1”

3.
存在表连接和事务的其他场合,也都应该尽量保证相关记录出现在同一个分库

4.
分库数最好不要特别多,以节省万一要全库扫描时产生的成本。在某些情况下,你的查询可能就是要扫描所有分库,一次分库查询就是一次网络I/O,但如果查询次数不多,这样的性能往往也可以接受。所以如无必要,不要设置过高的分库数;可以通过“清理三个月前数据”等机制以控制全库的总记录数,这样一来所需的分库数也不太多。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.