検索
ホームページデータベースmysql チュートリアルmysqlページングクエリを最適化する方法

ページングクエリの最適化方法: 1. サブクエリの最適化、ページング SQL ステートメントをサブクエリに書き換えることでパフォーマンスの向上を実現できます。 2. ID 制限の最適化により、クエリされたページ数とクエリされたレコード数に基づいてクエリされた ID の範囲を計算し、「との間の ID」ステートメントに基づいてクエリを実行できます。 3. インデックスの並べ替えに基づいて最適化し、インデックスを通じて関連するデータ アドレスを見つけ、テーブル全体のスキャンを回避します。 4. 遅延関連付けの最適化の場合、JOIN を使用して最初にインデックス列のページング操作を完了し、次にテーブルに戻って必要な列を取得できます。

mysqlページングクエリを最適化する方法

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

ページング クエリの効率は、データ量が大きい場合に特に重要であり、フロントエンドの応答やユーザー エクスペリエンスに影響を与えます。

ページングクエリの最適化方法

1.サブクエリ最適化を利用する

こちらこのメソッドは、オフセット位置で ID を見つけてからクエリを実行するため、ID が増加する場合に適しています。

サブクエリ最適化の原則: https://www.jianshu.com/p/0768ebc4e28d

select * from sbtest1 where k=504878 limit 100000,5; クエリ プロセス:

まず、インデックス リーフ ノード データがクエリされ、次に、リーフ ノードの主キー値に従って、クラスター化インデックス上のすべての必須フィールド値がクエリされます。次の図の左側に示すように、インデックス ノードを 100,005 回クエリし、クラスター化インデックス データを 100,005 回クエリし、最後に最初の 100,000 項目から結果をフィルタリングして、最後の 5 項目を削除する必要があります。 MySQL は、クラスター化インデックス内のデータのクエリに大量のランダム I/O を費やし、100,000 のランダム I/O によってクエリされたデータは結果セットには表示されません。

mysqlページングクエリを最適化する方法

インデックスは最初に使用されるため、最初にインデックスのリーフ ノードに沿って必要な最後の 5 ノードまでクエリを実行してから、クラスター化インデックス内の実際のデータをクエリしてみてはいかがでしょうか。上の図の右側のプロセスと同様に、これには 5 つのランダム I/O のみが必要です。これはサブクエリの最適化で、オフセット位置にidを配置してからクエリを実行する方法で、idが増加する場合に適した方法です。以下に示すように:

mysql> select *  from sbtest1 where k=5020952 limit 50,1;
mysql> select id  from sbtest1 where k=5020952 limit 50,1;
mysql> select * from sbtest1 where k=5020952 and id>=( select id  from sbtest1 where k=5020952 limit 50,1) limit 10;
mysql> select * from sbtest1 where k=5020952 limit 50,10;

サブクエリの最適化では、述語の k にインデックスがあるかどうかがクエリの効率に大きな影響を与えます。上記のステートメントはインデックスを使用せず、テーブル全体のスキャンには 24.2 秒かかります。インデックスの場合は 24.2 秒かかりますが、0.67 秒かかります。

mysql> explain  select * from sbtest1 where k=5020952 and id>=( select id  from sbtest1 where k=5020952 limit 50,1) limit 10;
+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+
| id | select_type | table   | partitions | type        | possible_keys | key        | key_len | ref   | rows | filtered | Extra                                    |
+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+
|  1 | PRIMARY     | sbtest1 | NULL       | index_merge | PRIMARY,c1    | c1,PRIMARY | 8,4     | NULL  |   19 |   100.00 | Using intersect(c1,PRIMARY); Using where |
|  2 | SUBQUERY    | sbtest1 | NULL       | ref         | c1            | c1         | 4       | const |   88 |   100.00 | Using index                              |
+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+
2 rows in set, 1 warning (0.11 sec)

ただし、この最適化方法には制限もあります。

  • この記述方法では、主キー ID が連続している必要があります

  • Where 句に他の条件を追加することはできません

2. ID 制限の最適化を使用します

このメソッドは、データの ID がテーブルは連続しています 増分的に、クエリされたページ数とクエリされたレコード数に基づいてクエリされた ID の範囲を計算でき、 と の間の ID を使用してクエリできます。

データベース内のテーブルの ID が継続的に増加すると仮定すると、クエリされた ID の範囲は、クエリされたページ数とクエリされたレコード数に基づいて計算され、ID に基づいてクエリされます。と の間のステートメント。 ID の範囲は、ページング式によって計算できます。たとえば、現在のページ サイズが m で、現在のページ番号が no1 の場合、ページの最大値は max=(no1 1)m-1 となります。 、最小値が min=no1m である場合、SQL ステートメントは min と max の間の id として表現できます。

select * from sbtest1 where id between 1000000 and 1000100 limit 100;

このクエリ方法はクエリ速度を大幅に最適化でき、基本的には数十ミリ秒以内に完了できます。 ID を明確に知る必要があるという制限がありますが、通常、ページング クエリのビジネス テーブルには基本的な ID フィールドが追加され、ページング クエリに大きな利便性をもたらします。上記の SQL を記述する別の方法もあります:

select * from sbtest1 where id >= 1000001 limit 100;

実行時間の違いがわかります:

mysql> show profiles;
+----------+------------+--------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                        |
+----------+------------+--------------------------------------------------------------------------------------------------------------+
|        6 | 0.00085500 | select * from sbtest1 where id between 1000000 and 1000100 limit 100                                         |
|        7 | 0.12927975 | select * from sbtest1 where id >= 1000001 limit 100                                                          |
+----------+------------+--------------------------------------------------------------------------------------------------------------+

また、複数のテーブルでよく使用される in メソッドを使用してクエリを実行することもできます。クエリを実行するときは、他のテーブル クエリの ID セットを使用してクエリを実行します。

select * from sbtest1 where id in (select id from sbtest2 where k=504878) limit 100;

クエリで使用する場合、一部の mysql バージョンは in 句での制限の使用をサポートしていないことに注意してください。

3. インデックスの並べ替えに基づく最適化

インデックスに基づいた並べ替えでは、インデックス クエリで最適化アルゴリズムを使用し、インデックスを通じて関連するデータ アドレスを見つけ、テーブルが完全になることを回避します。スキャンして、時間を大幅に節約します。また、Mysql には関連するインデックス キャッシュもあるので、同時実行性が高い場合にはキャッシュを使用するとよいでしょう。 MySQL では次のステートメントを使用できます:

SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M

このメソッドは、データ量が多い状況 (数万のタプル) に適しています。ORDER BY の後の列オブジェクトがプライマリであることが最善です。キーまたは一意のインデックスを使用するため、インデックスを使用して ORDER BY 操作を排除できますが、結果セットは安定しています。たとえば、次の 2 つのステートメント:

mysql> show profiles;
+----------+------------+--------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                        |
+----------+------------+--------------------------------------------------------------------------------------------------------------+
|        8 | 3.30585150 | select * from sbtest1 limit 1000000,10                                                                       |
|        9 | 1.03224725 | select * from sbtest1 order by id limit 1000000,10                                                           |
+----------+------------+--------------------------------------------------------------------------------------------------------------+

インデックス フィールド ID に order by ステートメントを使用した後、パフォーマンスが大幅に向上しました。

4. 遅延関連付けを使用して最適化する

上記のサブクエリと同様に、JOIN を使用して最初にインデックス列のページング操作を完了し、その後 Get を返すことができます。テーブルから必要な列を選択します。

rreeee

mysqlページングクエリを最適化する方法

从实验中可以得出,在采用JOIN改写后,上面的两个局限性都已经解除了,而且SQL的执行效率也没有损失。

5、记录上次查询结束的位置

和上面使用的方法都不同,记录上次结束位置优化思路是使用某种变量记录上一次数据的位置,下次分页时直接从这个变量的位置开始扫描,从而避免MySQL扫描大量的数据再抛弃的操作。

select * from t5 where id>=1000000 limit 10;

mysqlページングクエリを最適化する方法

6、使用临时表优化

使用临时存储的表来记录分页的id然后进行in查询

这种方式已经不属于查询优化,这儿附带提一下。

对于使用 id 限定优化中的问题,需要 id 是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行 in 查询。这样能够极大的提高传统的分页查询速度,尤其是数据量上千万的时候。

【相关推荐:mysql视频教程

以上がmysqlページングクエリを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?Apr 14, 2025 am 12:18 AM

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。

MySQL:新規ユーザー向けのリソースとチュートリアルMySQL:新規ユーザー向けのリソースとチュートリアルApr 14, 2025 am 12:16 AM

MySQL学習パスには、基本的な知識、コアの概念、使用例、最適化手法が含まれます。 1)テーブル、行、列、SQLクエリなどの基本概念を理解します。 2)MySQLの定義、作業原則、および利点を学びます。 3)インデックスやストアドプロシージャなどの基本的なCRUD操作と高度な使用法をマスターします。 4)インデックスの合理的な使用や最適化クエリなど、一般的なエラーのデバッグとパフォーマンス最適化の提案に精通しています。これらの手順を通じて、MySQLの使用と最適化を完全に把握できます。

実際のmysql:例とユースケース実際のmysql:例とユースケースApr 14, 2025 am 12:15 AM

MySQLの実際のアプリケーションには、基本的なデータベース設計と複雑なクエリの最適化が含まれます。 1)基本的な使用法:ユーザー情報の挿入、クエリ、更新、削除など、ユーザーデータの保存と管理に使用されます。 2)高度な使用法:eコマースプラットフォームの注文や在庫管理など、複雑なビジネスロジックを処理します。 3)パフォーマンスの最適化:インデックス、パーティションテーブル、クエリキャッシュを使用して合理的にパフォーマンスを向上させます。

MySQLのSQLコマンド:実用的な例MySQLのSQLコマンド:実用的な例Apr 14, 2025 am 12:09 AM

MySQLのSQLコマンドは、DDL、DML、DQL、DCLなどのカテゴリに分割でき、データベースとテーブルの作成、変更、削除、データの挿入、更新、削除、複雑なクエリ操作の実行に使用できます。 1.基本的な使用には、作成可能な作成テーブル、INSERTINTO INSERTデータ、クエリデータの選択が含まれます。 2。高度な使用法には、テーブル結合、サブQueries、およびデータ集約のためのグループに参加します。 3.構文エラー、データ型の不一致、許可の問題などの一般的なエラーは、構文チェック、データ型変換、許可管理を介してデバッグできます。 4.パフォーマンス最適化の提案には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、およびデータの一貫性を確保するためのトランザクションの使用が含まれます。

InnoDBは酸コンプライアンスをどのように処理しますか?InnoDBは酸コンプライアンスをどのように処理しますか?Apr 14, 2025 am 12:03 AM

INNODBは、ロックメカニズムとMVCCを通じて、非論的、一貫性、および分離を通じて原子性を達成し、レッドログを介した持続性を達成します。 1)原子性:Undologを使用して元のデータを記録して、トランザクションをロールバックできることを確認します。 2)一貫性:行レベルのロックとMVCCを介してデータの一貫性を確保します。 3)分離:複数の分離レベルをサポートし、デフォルトでrepeatable -readが使用されます。 4)持続性:Redologを使用して修正を記録し、データが長時間保存されるようにします。

MySQLの場所:データベースとプログラミングMySQLの場所:データベースとプログラミングApr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQL:中小企業から大企業までMySQL:中小企業から大企業までApr 13, 2025 am 12:17 AM

MySQLは、中小企業に適しています。 1)中小企業は、顧客情報の保存など、基本的なデータ管理にMySQLを使用できます。 2)大企業はMySQLを使用して、大規模なデータと複雑なビジネスロジックを処理して、クエリのパフォーマンスとトランザクション処理を最適化できます。

Phantomの読み取りとは何ですか?Innodbはどのようにそれらを防ぐ(次のキーロック)?Phantomの読み取りとは何ですか?Innodbはどのようにそれらを防ぐ(次のキーロック)?Apr 13, 2025 am 12:16 AM

INNODBは、次のキーロックメカニズムを通じてファントムの読み取りを効果的に防止します。 1)Next-KeyLockingは、Row LockとGap Lockを組み合わせてレコードとギャップをロックして、新しいレコードが挿入されないようにします。 2)実際のアプリケーションでは、クエリを最適化して分離レベルを調整することにより、ロック競争を削減し、並行性パフォーマンスを改善できます。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール