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

时间:2009-07-05 00:13:10

标签: mysql algorithm performance next

我有一个网站,可以让人们查看表格中的行(每行都是一张图片)。有超过100,000行。您可以查看行的不同子集,并可以使用不同的排序顺序查看它们。当您查看其中一行时,可以单击“下一步”或“上一步”按钮以转到列表中的下一行/上一行。

您如何实施网站的“下一步”和“上一页”功能?

更具体地说,如果您有一个任意查询返回最多100,000行的列表,并且您知道某人正在查看的当前行的某些信息,那么如何有效地确定NEXT行?

这是我在网站年轻时提出的解决方案的伪代码,当只有1000行时它运行良好,但现在有10万行,我认为它占用了太多内存。

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。

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

3 个答案:

答案 0 :(得分:4)

您是否尝试将LIMIT - 子句应用于查询?

来自MySQL手册

  

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(使用预准备语句时除外)。

     

使用两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

使用mysql限制子句。 如select * from tableA limit 0,100;

您可以自然地对0和100进行参数化,将它们存储在您需要的表单中,这样您就可以知道用户点击Next时要使用的偏移量。这将要求您重新运行您呈现的每个下一个/上一页的查询。