LIMIT的原理:
这里以LIMIT N,M为基础:LIMIT首先要找查N+M行,然后从N行处,取M行。那么这样的SQL对一次查询1275500一个操作应该是一个昂贵的开销。对于LIMIT这类的优化,第一个目标就是让N变的尽可能的小或是不用。
三种常用的类型:
第一种:显示“上一页” “下一页”这种类型
第一页:
SELECT *FROM TABLE WHERE UID='48' ORDER BY POSTDATE DESC LIMIT 20;
第二页:根据第一页的postdate进行查询如:
SELECT *FROM TABLE WHERE UID='48' AND POSTDATE<'2009-11-3' ORDER BY POSTDATE DESC LIMIT 20;
第二种:显示 “ 1,2,3,4,5…”
第一页和第二页实现同上,如从第二页跳到第5页
SELECT *FROM TABLE WHERE UID='48' AND POSTDATE<'2009-11-3' ORDER BY POSTDATE DESC LIMIT 40,20;
看到这里明白为什么大型网站的分页不是一下标识出来完了,让都能点了吧。也不会给你一个框让你输入一个页跳过去了。如果跳的页面过多,也就存在N值过大的问题了。所以要想办法避免。
第三种:显示 “1,2,3,4,5,…. 末页” 或是 “首页,<<100,101,102,103 >>末页”
别的页面的跳转的上面一样。这里就加一个末页
SELECT *FROM TABLE WHERE UID='48' ORDER BY POSTDATE ASC LIMIT 20; 如果在条件可能和情况可以考用:between … and .. 带代替limit分页操作。
简单的逻辑转换。
SELECT *FROM TABLE WHERE UID='48' ORDER BY POSTDATE DESC LIMIT 127654,20;
转换成:
SELECT *FROM TABLE WHERE ID>127654 AND UID='48' ORDER BY POSTDATE DESC LIMIT 7654,20;