数据库水平切分中分页查询的问题是本文要介绍的主要内容。接下来我们通过一个例子来说明:昨天淘宝的同事问了我一个技术培训上讲师问的问题:我们对数据库关于商品的表放在了2个库,分别是A库和B库 ,每个库1张表,然后将id为奇数的放到A库中,id为偶数的放到B库中,现在需要查询价格在100-200之间的商品,并根据销量来排序,请给出具体的查询方案,然后总结这个方案有什么缺点。
1.保证查询结果正确性的方式:
比如查询第1-20条记录的时候,就得在A库中执行
- select*
- fromxxx
- wherexxx.price>=100and
- xxx.price<=200
- orderbyxxx.sales_volume
- limit0,20
然后B库也同样执行这样的SQL,***在程序中将2个数据库返回的结果作一次合并,再取前20条返回给用户
但是这样就带来一个问题,你是不知道到底前20的数据是怎么分布的,是10条在A库,10条在B库,还是15条在A库,5条在B库,当用户翻到第二页的时候,就得在A库中查询前40条记录,B库中也查询前40条记录出来了...越是后面的页数,需要查询的量就越大(PS:当然你可以忽悠自己说绝大部分用户最多就看前3页的结果)
2.保证性能的方式:
这个就随意得多了,为了保证性能,正确性是不太可能保证的,可以每次在A库查10条,B库查10条,然后直接返回,结果肯定和实际的结果有出入,但相差不至太多,不是每个用户都会发现第2页的商品可能出现销量比第1页的商品销量还要大的情况。
以上两种方法都各有优缺点,但***的结果可能都不是我们想要的,可是问题出在哪?貌似只有这2种方法了。
其实这里涉及到的是应该如何去分库的问题,如果结果是按id排序的话,这样分库显然是没问题的,但如果是按销量排序的话,那数据库分库的时候其实应该按销量来切分,比如销量在100以内的放到A库,销量在100-1000的放到B库,这样查询起来就轻松多了,最关键的就是要知道,我们分库的规则应该怎么去设定。
关于数据库水平切分中分页查询的问题的解决方案就介绍到这里了,希望本次的介绍能够对您有所帮助。
【编辑推荐】