Heim > Datenbank > MySQL-Tutorial > mysql 高效的limit分页查询案例分享

mysql 高效的limit分页查询案例分享

WBOY
Freigeben: 2016-06-01 09:57:06
Original
1157 Leute haben es durchsucht

根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,比如

<code class="language-sql">SELECT * FROM message ORDER BY id DESC</code>
Nach dem Login kopieren

按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:

<code class="language-sql">SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;//下一页
</code>
Nach dem Login kopieren

处理下一页的时候SQL语句可以是:

<code class="language-sql">SELECT * FROM message WHERE id</code>
Nach dem Login kopieren

不管翻多少页,每次查询只扫描20行。

缺点是只能提供上一页、下一页的链接形式,但是我们的产品经理非常喜欢“上一页 1 2 3 4 5 6 7 8 9 下一页”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的clue做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是2519,最小的是2500;

当是第10页的SQL如下:

<code class="language-sql">SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20</code>
Nach dem Login kopieren

比如要跳到第9页,SQL语句可以这样写:

<code class="language-sql">SELECT * FROM tb_goods_info WHERE auto_id </code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

比如要跳到第8页,SQL语句可以这样写:

<code class="language-sql">SELECT * FROM tb_goods_info WHERE auto_id </code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

比如要跳到第7页,SQL语句可以这样写:

<code class="language-sql">SELECT * FROM tb_goods_info WHERE auto_id </code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

跳转到第11页:

<code class="language-sql">SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20</code>
Nach dem Login kopieren

跳转到第12页:

<code class="language-sql">SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20</code>
Nach dem Login kopieren

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。

已在60W数据总量的表中测试,效果非常明显

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage