例如,我的表具有以下数据:

id(auto increment)     :place     :views
1                      :test1     :20
2                      :test2     :50
3                      :test3     :30


我在考虑分页系统。

在对视图进行排序时,我使用此sql。

select * from table order by views desc;


结果如下:

id    :place    :views
2     :test2    :50
3     :test3    :30
1     :test1    :20


我想使用此数据进行分页。

Page 1:
select * from table order by views desc limit 0, 2;
Page 2:
select * from table order by views desc limit 2, 2;


但是,如果此表中有许多数据,则数据库性能会很懒。

我找到了解决此问题的好方法。
http://www.slideshare.net/Eweaver/efficient-pagination-using-mysql

但是,我的数据没有可排序的ID。

我在寻找任何好主意。

最佳答案

如果

在mytable中是UNIQUE,则要实现有效的“下一页”功能:

CREATE INDEX mytable_IX1 ON mytable (views, id);


对于第一页:

SELECT id, place, views
  FROM mytable
 ORDER BY views DESC, id DESC
 LIMIT 2


检索行。如果有完整的两行,则可能会有更多行,因此保留该“最后”行中的idviews值,以用于“下一页”查询。

对于下一页,使用从上一页的“最后一行”保存的idviews值:

SELECT id, place, views
  FROM mytable
 WHERE views <= :pp_views AND ( id < :pp_id OR views < :pp_views )
 ORDER BY views DESC, id DESC
 LIMIT 2


如果获得完整的两行,则可以得到“下一页”,再次使用上一页“最后一行”中的idviews值,查询是完全相同的:

SELECT id, place, views
  FROM mytable
 WHERE views <= :pp_views AND ( id < :pp_id OR views < :pp_views )
 ORDER BY views DESC, id DESC
 LIMIT 2


尚不清楚为什么这种方法对您不起作用。您可以使用的表格上没有唯一的列吗? (您的问题建议您有一个唯一的(auto_increment)id列。)

关于mysql - mysql的良好分页性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25816732/

10-12 13:53
查看更多