当我转到URL:https://stackoverflow.com/questions?sort=votes时,StackOverflow按投票顺序返回问题列表。我知道如何实现这个功能,但我正在寻找"最好的方式"。我将描述一些方法及其缺点。
order by
,limit
,offset
(用于分页)。缺点:如果行数很大,则会很慢。votes
列创建索引,并使用order by
,limit
,offset
。缺点:votes
可能会经常更改,每次更新一行时,都会重新编制索引。如果行数很大,limit
和offset
仍然会放慢速度。 更多讨论:如果排序功能不仅仅依赖于votes
,而是依赖creationDate
,numberOfViews
等其他列,以上两种方式都不好。
第一种方式非常慢,每次客户端获得有序问题列表时,计算每行的函数f(votes, creationDate, numberOfViews)
,然后按顺序排序,然后应用panigation,非常慢!
第二种方式也不好,因为votes
,numberOfViews
经常更改,我需要创建一个额外的列fValue
来存储预先计算的结果f(votes, creationDate, numberOfViews)
。每次更改votes
或numberOfViews
时,我都需要更新此列。此外,如果以后函数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
答案 0 :(得分:0)
有合适的INDEX - 是的。使用OFFSET - 否。
相反,请记住“你离开的地方”。讨论问题和解决方案: http://mysql.rjweb.org/doc.php/pagination