ホームページ > バックエンド開発 > PHPチュートリアル > MySQL分页性能问题,Limit 性能问题求解决!

MySQL分页性能问题,Limit 性能问题求解决!

WBOY
リリース: 2016-06-06 20:48:48
オリジナル
1314 人が閲覧しました

众所周知,Mysql分页就要用到Limit进行分页,数据量/分页数小的时候Limit性能是可想而知的。 如:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts WHERE pid='123456' ORDER BY pid ASC LIMIT 100,100;
</code>
ログイン後にコピー
ログイン後にコピー

上述SQL语句性能没有任何问题。

但是,如果当offset便宜了过大的情况就会出现性能瓶颈。 如:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts WHERE pid='123456' ORDER BY pid ASC LIMIT 159000,100;
</code>
ログイン後にコピー
ログイン後にコピー

若要解决Limit offset过大的时候,可以采用子查询的方法进行分页。 如:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts ORDER BY pid ASC LIMIT 159000,100;
</code>
ログイン後にコピー
ログイン後にコピー

等价于:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts WHERE pid>=(SELECT pid FROM posts LIMIT 159000,1)ORDER BY pid ASC LIMIT 100;
</code>
ログイン後にコピー
ログイン後にコピー

此时的性能是纯粹LIMIT 159000,100 的几倍至高。

但是问题又来了,子查询又必须是数据连续,所以无法加入WHERE查询条件,如:

<code class="lang-mysql">SELECT tid,pid,author,hash,dateline FROM posts WHERE tid=10 AND pid>=(SELECT pid FROM posts LIMIT 159000,1)ORDER BY pid ASC LIMIT 100;
</code>
ログイン後にコピー
ログイン後にコピー

此时的结果并非我想要的结果。

所以求高性能解决LIMIT分页的方法。 在线等。

============================ PS: pid 为主键

回复内容:

众所周知,Mysql分页就要用到Limit进行分页,数据量/分页数小的时候Limit性能是可想而知的。 如:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts WHERE pid='123456' ORDER BY pid ASC LIMIT 100,100;
</code>
ログイン後にコピー
ログイン後にコピー

上述SQL语句性能没有任何问题。

但是,如果当offset便宜了过大的情况就会出现性能瓶颈。 如:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts WHERE pid='123456' ORDER BY pid ASC LIMIT 159000,100;
</code>
ログイン後にコピー
ログイン後にコピー

若要解决Limit offset过大的时候,可以采用子查询的方法进行分页。 如:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts ORDER BY pid ASC LIMIT 159000,100;
</code>
ログイン後にコピー
ログイン後にコピー

等价于:

<code class="lang-mysql">SELECT pid,author,hash,dateline FROM posts WHERE pid>=(SELECT pid FROM posts LIMIT 159000,1)ORDER BY pid ASC LIMIT 100;
</code>
ログイン後にコピー
ログイン後にコピー

此时的性能是纯粹LIMIT 159000,100 的几倍至高。

但是问题又来了,子查询又必须是数据连续,所以无法加入WHERE查询条件,如:

<code class="lang-mysql">SELECT tid,pid,author,hash,dateline FROM posts WHERE tid=10 AND pid>=(SELECT pid FROM posts LIMIT 159000,1)ORDER BY pid ASC LIMIT 100;
</code>
ログイン後にコピー
ログイン後にコピー

此时的结果并非我想要的结果。

所以求高性能解决LIMIT分页的方法。 在线等。

============================ PS: pid 为主键

这篇PDF可以解决你的问题

Efficient Pagination Using MySQL

你的pid是啥,不是主键吗?最后一条 pid=10 AND pid>=(SELECT pid FROM posts LIMIT 159000,1) 有能同时成立吗

外面有的条件,子查询里面照样写就行了,和子查询的条件相同,order by相同,比如: select * from user where sex=2 and issingle=0 and id

<code>    ALTER TABLE `posts `  ADD INDEX `tid_pid` USING BTREE (`tid`,`pid`) comment '';
</code>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート