例如,我的表中包含以下数据:
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。
我正在寻找任何好主意。
答案 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
检索行。如果您获得完整的两行,则可能会有更多行,因此请保留该“最后”行中的views
和id
值,以便在“下一页”查询中使用。
对于下一页,请使用从上一页的“最后一行”保存的views
和id
的值:
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
如果您获得完整的两行,那么您可以获得“下一页”,再次使用上一页“最后一行”中的views
和id
值,查询完全相同:
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,然后搜索少于具有限制的视图。