MySQL结果集上Next按钮的高效算法

uttx8gqw  于 2023-05-16  发布在  Mysql
关注(0)|答案(3)|浏览(147)

我有一个网站,可以让人们查看表中的行(每行是一张图片)。有超过100,000行。您可以查看行的不同子集,也可以使用不同的排序顺序查看它们。当您查看其中一行时,您可以单击“下一行”或“上一行”按钮转到列表中的下一行/上一行。
您将如何实现网站的“下一个”和“上一个”功能?
更具体地说,如果你有一个任意的查询,返回一个多达100,000+行的列表,并且你知道一些关于某人正在查看的当前行的信息,你如何有效地确定NEXT行?
下面是我在网站还很年轻的时候提出的解决方案的伪代码,当只有1000行时,它工作得很好,但是现在有100,000行,我认为它占用了太多的内存。

int nextRowId(string query, int currentRowId)
{
    array allRowIds = mysql_query(query);  // Takes up a lot of memory!
    int currentIndex = (index of currentRowId in allRowIds);  // Takes time!
    return allRowIds[currentIndex+1];
}

在考虑这个问题时,请记住,网站可以存储有关当前行的更多信息,而不仅仅是其ID(例如,当前行在结果集中的位置),并且此信息可以用作帮助确定下一行ID的提示。

编辑:抱歉之前没有提到,但这不仅仅是一个静态网站:通常可以将行添加到列表中,并且可以在列表中对行重新排序。(更罕见的是,行可以从列表中删除。)我认为我应该担心这类事情,但也许你可以说服我,否则。

xuo3flqw

xuo3flqw1#

你有没有试过将LIMIT-子句应用到查询中?

来自MySQL手册

LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数值参数,这两个参数必须都是非负整数常量(使用预准备语句时除外)。
有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

使用一个参数,该值指定从结果集开始返回的行数:

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows
pcrecxhr

pcrecxhr2#

在大型数据集上,偏移量是一个非常昂贵的操作,请查看此演示文稿以了解有关mySQL中高效分页的更多信息:http://www.scribd.com/doc/14683263/Efficient-Pagination-Using-MySQL

31moq8wy

31moq8wy3#

使用mysql的limit子句。如select * from tableA limit 0,100;
您可以自然地对0和100进行参数化,将它们存储在表单中或任何您需要的地方,这样您就可以知道当用户点击Next时要使用的偏移量。这将要求您为呈现的每个下一个/上一个页面重新运行查询。

相关问题