Heim > Datenbank > MySQL-Tutorial > 高效的MySQL分页

高效的MySQL分页

WBOY
Freigeben: 2016-06-07 16:36:25
Original
974 Leute haben es durchsucht

PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。 分页 首先看一下分页的基本原理: 本文来自leo108's blog mysql explain SELECT * FROM

PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。分页

首先看一下分页的基本原理:

本文来自leo108's blog

mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)

http://leo108.com/pid-1914.asp

limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

本文来自http://leo108.com

文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:

本文来自http://leo108.com

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;
Nach dem Login kopieren

处理”下一页”的时候SQL语句可以是:http://leo108.com/pid-1914.asp

SELECT * FROM message WHERE id 
<p> </p><p class="Gar360">本文来自leo108's blog
</p> 
<p>不管翻多少页,每次查询只扫描20行。</p><p class="Gar360">Mysql</p> 
<p>缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”5?6 7 8 9 下一页>”这样的链接方式,怎么办呢?<span class="Gar360">分页</span> </p>
<p>如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:</p><p class="Gar360">分页</p> 
<pre class="brush:php;toolbar:false">SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;
Nach dem Login kopieren

跳转到第13页:

本文来自leo108's blog

SELECT * FROM message WHERE id 
<p> <span class="Gar360">采集者烂JJ</span> </p>
<p>原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。</p><p class="Gar360">http://leo108.com/pid-1914.asp</p> 
<p>注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。</p><p class="Gar360">Mysql</p> 
<p>已在60W数据总量的表中测试,效果非常明显。<span class="Gar360">分页</span> </p>
<p>转自:http://www.fuchaoqun.com/2009/04/efficient-pagination-using-mysql/</p><p class="Gar360">Mysql</p> 
    


Nach dem Login kopieren
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