【问题标题】:How to dynamically sort table data with keyset pagination?如何使用键集分页对表数据进行动态排序?
【发布时间】:2019-11-22 04:39:43
【问题描述】:

我有这张桌子

users(
  id uuid,
  cpf string,
  name string,
  email string,
  admin boolean
);

索引如下:cpf、name、admin。

当我第一次从 API 加载这些数据时,它将由管理员排序(管理员用户将位于顶部)。但是,由于我使用的是键集分页,所以我在数据集中查找最后一个 id 并再次查询(它有一个 X,它是动态的):

        SELECT  id,
            name,
            cpf,
            email,
            Coalesce(admin, '0') as admin   
        FROM 
            users
        WHERE 
            cpf >= '' (empty for the first query, then it would be the last one in the first data set)
        AND (
                name like 'X%'
            OR
                email like 'X%'
        )
        ORDER BY 
            X (admin, name, cpf) 
        ASC (or desc, depending on what was chosen)
        LIMIT 
            X

所以这里我有我的第一个数据集,加载正常,但是当我改变页面时,它会寻找比实际更大的 cpfs,它们不是实际的下一页。我将如何解决这个问题?考虑到用户可以选择是否订购:admin、name 和 cpf?订单的同一列需要是最后一行的行吗?如果我由管理员订购,这将如何工作,因为它是一个布尔值?

【问题讨论】:

    标签: database postgresql pagination


    【解决方案1】:

    keyset分页,如果要按(admin, name, cpf)排序,条件必须是

    WHERE (admin, name, cpf) > (max_admin, max_name, max_cpf)
    

    max_* 值是上一个查询返回的最后一个值。

    【讨论】:

    • 这不会降低索引性能吗? (它们都是单列索引)。此外,它们被订购一次,例如:quasar.dev/vue-components/…(这是我将使用的)
    • 您需要一个多列索引来使键集分页高效。
    • 哦,所以我按最常用的顺序索引它,对吗?我是按三个还是只按一个排序?总之,非常感谢,帮了大忙!
    • 必须像ORDER BY 子句一样定义索引。索引行被限制在 1000 字节以上,但如果您接近这一点,请减少列数。
    • @NataJdaCOliveira 对,是“字典顺序”:(a, b, c) < (x, y, z)a < x OR (a = x AND b < y) OR (a = x AND b = y AND c < z) 相同。
    猜你喜欢
    • 2014-11-30
    • 2016-09-30
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多