我的分页技术可能会有所回落,我该如何改进呢?

时间:2014-01-12 07:16:01

标签: sql database pagination

我想为我的网页执行分页。我正在使用的方法(我主要在互联网上找到)将在下面举例说明。

假设我有下表user

+----+------+----------+
| id | name | category |
+----+------+----------+
|  1 | a    |        1 |
|  2 | b    |        2 |
|  3 | c    |        2 |
|  4 | d    |        3 |
|  5 | e    |        1 |
|  6 | f    |        3 |
|  7 | g    |        1 |
|  8 | h    |        3 |
|  9 | i    |        2 |
| 10 | j    |        2 |
| 11 | k    |        1 |
| 12 | l    |        3 |
| 13 | m    |        3 |
| 14 | n    |        3 |
| 15 | o    |        1 |
| 16 | p    |        1 |                                                     
| 17 | q    |        2 |                                                        
| 18 | r    |        1 |                                                           
| 19 | s    |        3 |                                                         
| 20 | t    |        3 |                                                          
| 21 | u    |        3 |                                                             
| 22 | v    |        3 |                                                          
| 23 | w    |        1 |
| 24 | x    |        1 |
| 25 | y    |        2 |
| 26 | z    |        2 |
+----+------+----------+

我想显示有关每页有2个用户的类别3用户的信息,我正在使用以下查询

select * from user where category=3 limit 0,2;

+----+------+----------+
| id | name | category |
+----+------+----------+
|  4 | d    |        3 |
|  6 | f    |        3 |
+----+------+----------+

以及接下来的两个

select * from user where category=3 limit 2,2;

+----+------+----------+
| id | name | category |
+----+------+----------+
|  8 | h    |        3 |
| 12 | l    |        3 |
+----+------+----------+

等等。

现在在实践中,我在一个表中有大约7000个元组。所以在速度方面有更好的方法来达到这个目的,或者就这个方法可能有的任何后备而言。

感谢。

3 个答案:

答案 0 :(得分:0)

您不想获取比当前页面可以处理的值更多的值,所以是的,您基本上每页都会进行一次查询。其他一些解决方案(例如Rails will_paginate)将执行基本相同的查询。

现在,您可以在客户端构建一些逻辑以在那里进行分页 - 一次预取多个(或所有)页面并将它们存储在客户端。这样,分页在客户端完全处理,无需进一步查询。如果用户可能只看整个页面的一小部分,那就有点浪费了。

如果您的实际生产表中包含更多列,则只能选择相关列而不是*,或者可能添加某种顺序(用于排序)。

答案 1 :(得分:0)

我希望这会有所帮助,你必须用你的页码代替your_page_number,每页的记录代替你样本中的records_per_page:

select A.* from
(select @row := @row + 1 as Row_Number, User.* from User 
join (select @row := 0) Row_Temp_View
where category = 3
) A
where row_number 
between (your_page_number * records_per_page)-records_per_page+1
and your_page_number * records_per_page;

注意这将获取正确的记录,而您的样本将不会,这是因为您的示例将始终提取两条记录,这并非总是如此,假设您有你想赢得的3个用户在两个页面中显示,所以你的样本将在第一页显示第一个和第二个,它将在第二个页面显示第二个和第三个不正确,我的代码将显示第一个和第二个在第一页和第二页中,它只会显示第三页......

答案 2 :(得分:-1)

您可以使用Datatables。它的意思与您正在寻找的完全相同。我成功地使用它来分页超过一百万行,这是非常快的&易于实施。