优化mysql的limit offset的例子

Jun 07, 2016 pm 05:55 PM
limit offset

在mysql中,通常使用limit做分页,而且经常会跟order by 连用。在order by 上加索引有时候是很有帮助的,不然系统会做很多的filesort

经常碰到的一个问题是limit的offset太高,如:limit 100000,20,这样系统会查询100020条,然后把前面的100000条都扔掉,这是开销很大的操作,导致查询很慢。假设所有分页的页面访问频率一样,这样的查询平均扫描表的一半数据。优化的方法,要么限制访问后面的页数,要么提升高偏移的查询效率。

一个简单的优化办法是使用覆盖查询(covering index)查询,然后再跟全行的做join操作。如:

代码如下:
SQL>select * from user_order_info limit 1000000,5;

这条语句就可以优化为:
代码如下:
select * from user_order_info inner join (select pin from user_order_info limit 1000000,5) as lim using(pin);
SQL>explain select * from user_order_info limit 1000000,5;
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
| 1 | SIMPLE | user_order_info | ALL | NULL | NULL | NULL | NULL | 23131886 | |
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
1 row in set (0.00 sec)
SQL>explain extended select * from user_order_info inner join (select pin from user_order_info limit 1000000,5) as lim using(pin);
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
| 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | |
| 1 | PRIMARY | user_order_info | eq_ref | PRIMARY | PRIMARY | 42 | lim.pin | 1 | 100.00 | |
| 2 | DERIVED | user_order_info | index | NULL | PRIMARY | 42 | NULL | 23131886 | 100.00 | Using index |
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
3 rows in set, 1 warning (0.66 sec)


根据两个explain的对比,可以清晰发现,第一个未使用索引,扫描了23131886行,第二个也扫描了同样的行数,但是使用了索引,效率提高了。这样可以直接使用index得到数据,而不去查询表,当找到需要的数据之后,在与全表join,获得其他的列。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravelのtakeとlimitの使い方を詳しく解説 Laravelのtakeとlimitの使い方を詳しく解説 Mar 10, 2024 pm 05:51 PM

「Laravelのtakeとlimitの使い方を詳しく解説」 Laravelではtakeとlimitの2つがよく使われており、データベースクエリで返されるレコード数を制限するために使用されます。これらの機能は似ていますが、特定の使用シナリオでは微妙な違いがいくつかあります。この記事では、これら 2 つのメソッドの使用法を詳細に分析し、具体的なコード例を示します。 1. Take メソッド Laravel では、take メソッドは返されるレコードの数を制限するために使用され、通常は orderBy メソッドと組み合わせられます。

Laravelにおけるtakeとlimitの機能比較と使い方 Laravelにおけるtakeとlimitの機能比較と使い方 Mar 09, 2024 pm 09:09 PM

Take と limit は、Laravel でクエリ結果セットの数を制限するためによく使用される 2 つのメソッドです。機能的には類似点がありますが、使用方法や詳細がいくつか異なります。この記事では、2 つのメソッドの機能と使用法を詳細に比較し、読者がそれらの違いとそれらを正しく適用する方法をよりよく理解できるように、具体的なコード例を示します。 1.takeメソッド takeメソッドはLaravelEloquentクエリビルダーにあります

Laravelのtakeとlimitの違いを深く掘り下げる Laravelのtakeとlimitの違いを深く掘り下げる Mar 10, 2024 pm 01:00 PM

Laravelでは、クエリ結果の数を制限するために、takeメソッドやlimitメソッドなど、いくつかのメソッドをよく使用します。どちらもクエリ結果の数を制限するために使用できますが、微妙な違いがいくつかあります。この記事では、Laravelにおけるtakeとlimitの違いを詳しく掘り下げ、具体的なコード例で説明します。まずはtakeメソッドを見てみましょう。 take メソッドは Eloquent の一部であり、通常は次の目的で使用されます。

Java でストリーム操作に Stream の制限およびスキップ機能を使用する方法 Java でストリーム操作に Stream の制限およびスキップ機能を使用する方法 Jun 26, 2023 pm 03:55 PM

StreamAPI は Java 8 で導入され、コレクションの操作を大幅に簡素化できます。 Stream クラスは、フィルタリング、マッピング、マージなど、ストリームを操作するための多くの機能メソッドを提供します。このうち、limit と Skip は、ストリーム操作の要素数を制限するために使用される 2 つの関数です。 1. Limit 関数 limit 関数は、ストリーム内の要素数を制限するために使用され、制限数を表す long 型パラメータ n を受け入れます。制限関数を呼び出した後、新しいストリームが返されます。このストリームには、

ファイナルファンタジー7の制限を節約する方法 ファイナルファンタジー7の制限を節約する方法 Mar 07, 2024 pm 06:40 PM

ファイナルファンタジー7では、ダメージを受けたり、敵を攻撃したり、コンボをヒットさせたりすることで、大ダメージを与えたり、強力なサポート効果を与えたりする極限スキルを使用するための制限を蓄積することができます。ファイナルファンタジー7のリミットセーブ方法 1.ダメージを受ける キャラクターが敵から攻撃を受けたり、味方が攻撃を受けたりすると、リミットバーが徐々に増加していきます。受けるダメージが大きいほど、制限バーが早く満たされます。 2. 敵を攻撃したり、敵を積極的に攻撃したりすると、リミットバーの充填速度が増加する可能性があります。リミットは通常攻撃、スキル、魔法を使用して蓄積できます。 3.ヒットしたコンボキャラクターが連続して敵の攻撃を受けると、リミットバーの充填速度が加速します。これは、敵の注意を引くか、ホールドを使用することで実行できます。

PHP 通知: 未定義のオフセット ソリューション PHP 通知: 未定義のオフセット ソリューション Jun 25, 2023 am 09:51 AM

PHP Notice:Unknownoffset は一般的な PHP プログラム エラーです。これは、プログラムが配列内に存在しない添字を使用しようとして、プログラムが正常に実行できなくなることを意味します。このエラーは通常、PHP インタープリタが次の警告メッセージを表示したときに発生します。 PHP Notice:Unknownoffset エラーを解決する方法は次のとおりです。 まず、コードを確認してください。

さまざまな MySQL ページング実装 さまざまな MySQL ページング実装 Feb 19, 2024 pm 03:26 PM

MySQL のページング メソッドとは何ですか? 特定のコード例が必要です。MySQL はリレーショナル データベース管理システムです。クエリの効率を向上させ、データ送信量を削減するために、ページング クエリは非常に一般的な要件です。 MySQL にはさまざまなページング メソッドが用意されており、これらのメソッドについては以下で詳しく紹介し、具体的なコード例を示します。 LIMIT 句を使用したページング: LIMIT 句は、クエリ結果で返される行数を制限するために使用されます。 2 つのパラメータがあり、最初のパラメータは返された結果の開始オフセット位置 (0 からカウント) を指定し、2 番目のパラメータは返された結果の開始オフセット位置を指定します。

PHP 注意: 未定義のオフセット: 4 ソリューション PHP 注意: 未定義のオフセット: 4 ソリューション Jun 22, 2023 pm 04:51 PM

PHP Notice:Unknownoffset:4 の解決策 PHP でコードを作成する過程で、「PHP Notice:Unknownoffset:4」のようなエラー メッセージが表示されることがあります。このエラー メッセージは、配列にアクセスするときに、存在しない要素にアクセスしようとしたことを意味します。具体的には、要素が 3 つだけ含まれた配列 $my_array があり、$my_array にアクセスしようとすると、

See all articles