当面试官追问你其中细节的时候,你就可以这样来引导。
理论上说,分页查询要在全局有序的情况下进行,但是在分库分表以后,要做到全局有序就很难了。假如说我们的数据库order_tab是以buyer_id % 2来进行分表的,如果你要执行一个语句
SELECT * FROM order_tab ORDER BY id LIMIT 4 OFFSET 2
实际执行查询的时候,就要考虑各种数据的分布情况。
符合条件的数据全部在某个表里面。在这就是order_tab_0上有全部数据,或是order_tab_1上有全部数据。
偏移量中前面两条全部在一张表,但是符合条件的数据在另外一张表
偏移量和数据在两张表都有
在分库分表中,一个SELECT语句生成的目标语句是这样的:
SELECT * FROM order_tab ORDER BY id LIMIT 6 OFFSET 0
SELECT * FROM order_tab ORDER BY id LIMIT 6 OFFSET 0
注意看LIMIT部分,被修改成了0,6
。通俗的说,如果一个分页语句是 LIMIT x OFFSET y 的形式,那么最终生成的目标语句就是 LIMIT x + y OFFSET 0。
LIMIT x OFFSET y => LIMIT x+y OFFSET 0
当分库分表中间件拿到这两个语句的查询结果之后,就要在内存里进行排序,再找出全局的LIMIT 4 OFFSET 2
可以先回答这种全局排序的思路,关键词就是LIMIT x + y OFFSET 0