避免OFFSET,WHERE分页应该如何?

时间:2013-05-27 05:35:38

标签: mysql sql

您好我正在阅读http://domasmituzas.files.wordpress.com/2011/09/mysqluc2008-mysql-web.pdf 并发现“良好的分页练习”与WHERE有关,而不是OFFSET,LIMIT

任何代码示例,说明怎么做?

enter image description here

2 个答案:

答案 0 :(得分:1)

我不是sql guru。但据我所知,WHERE子句指示在特定TABLE上选择哪一行。这是在LIMIT子句之前执行的。

LIMIT子句限制SELECT语句返回的行数。因此,此子句是在WHERE子句之后执行的,该子句的结论是WHERELIMIT更快。

WHERE条款的PERFORMANCE仍然取决于您如何形成条件。

这是我用于分页的内容:

SELECT *
    FROM table T
    WHERE T.Id > 100
    LIMIT 100;

而不是使用LIMIT / OFFSET

SELECT *
    FROM table T
    LIMIT 100, 100;

您可以清楚地看到大表的优势。

答案 1 :(得分:1)

A better presentation可用,其中包含如何在不使用OFFSET的情况下实现分页的说明和示例。

<强>行情:

  

更大的OFFSET将增加活动数据集,MySQL必须带来   内存中永远不会返回给调用者的数据。

另一种解决方案是存储最后看到的ID。 对于下一页http://domain.com/forum?page=2&last_seen=100&dir=next,查询为:

SELECT ... WHERE id < 100 /* last_seen */ BY id ORDER BY DESC LIMIT $page_size

上一页:http://domain.com/forum?page=1&last_seen=98&dir=prev

SELECT ... WHERE id > 98 /* last_seen */ ORDER BY id ASC LIMIT $page_size