mysql的分页性能很好

时间:2014-09-12 21:00:21

标签: mysql sql

例如,我的表中包含以下数据:

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。

我正在寻找任何好主意。

2 个答案:

答案 0 :(得分:1)

要实现高效的“下一页”功能,如果id在mytable中是唯一的:

CREATE INDEX mytable_IX1 ON mytable (views, id);

第一页:

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

检索行。如果您获得完整的两行,则可能会有更多行,因此请保留该“最后”行中的viewsid值,以便在“下一页”查询中使用。

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

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

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

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列。)

答案 1 :(得分:0)

在你的情况下,我会索引视图,接下来是你示例中最后显示的ID的链接,然后是&index=3

然后查询将获取视图ID 3,然后搜索少于具有限制的视图。