根据StackOverflow等条件获取问题的最佳方法

时间:2015-02-26 19:31:07

标签: mysql performance sorting pagination sql-order-by

当我转到URL:https://stackoverflow.com/questions?sort=votes时,StackOverflow按投票顺序返回问题列表。我知道如何实现这个功能,但我正在寻找"最好的方式"。我将描述一些方法及其缺点。

  1. 只需使用order bylimitoffset(用于分页)。缺点:如果行数很大,则会很慢。
  2. votes列创建索引,并使用order bylimitoffset。缺点:votes可能会经常更改,每次更新一行时,都会重新编制索引。如果行数很大,limitoffset仍然会放慢速度。
  3. 更多讨论:如果排序功能不仅仅依赖于votes,而是依赖creationDatenumberOfViews等其他列,以上两种方式都不好。

    第一种方式非常慢,每次客户端获得有序问题列表时,计算每行的函数f(votes, creationDate, numberOfViews),然后按顺序排序,然后应用panigation,非常慢!

    第二种方式也不好,因为votesnumberOfViews经常更改,我需要创建一个额外的列fValue来存储预先计算的结果f(votes, creationDate, numberOfViews) 。每次更改votesnumberOfViews时,我都需要更新此列。此外,如果以后函数f将被更改,那就太可怕了!

    我正在寻找解决这些问题的最佳方法,希望有人能帮助我。

    更新

    Schema看起来像这样:

    Question (
        id: int primary key auto_increment,
        votes: int default 0,
        creationDate: timestamp default current_timestamp,
        numberOfViews: int default 0
    )
    

    选择问题列表:

    select *
    from Question
    order by votes
    limit index, 100
    

    如果基于其他列排序功能:

    select *
    from Question
    order by votes + numberOfViews * 0.96
    limit index, 100
    

    或创建新列fValue = votes + numberOfViews * 0.96

    select *
    from Question
    order by fValue
    limit index, 100
    

1 个答案:

答案 0 :(得分:0)

有合适的INDEX - 是的。使用OFFSET - 否。

相反,请记住“你离开的地方”。讨论问题和解决方案: http://mysql.rjweb.org/doc.php/pagination