まず、MySQL のバージョンについて説明します。 mysql> バージョンを選択します(); +-----------+ | バージョン() | +-----------+ | 5.7.17 | +-----------+ セット内の 1 行 (0.00 秒) テーブル構造: mysql> desc テスト; +--------+----------------------+------+-----+---------+----------------+ | フィールド | タイプ | Null | キー | デフォルト | 追加 | +--------+----------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | val | int(10) 符号なし | NO | MUL | 0 | | | ソース | int(10) 符号なし | NO | | 0 | | +--------+----------------------+------+-----+---------+----------------+ セット内の 3 行 (0.00 秒) id は自動インクリメントの主キーであり、val は一意でないインデックスです。 合計500万件の大量のデータを投入します。 mysql> テストから count(*) を選択します。 +----------+ | カウント(*) | +----------+ |5242882| +----------+ セット1列(4.25秒)
mysql> select * from test where val=4 limit 300000,5; +---------+-----+--------+ | id | 値 | ソース | +---------+-----+--------+ | 3327622 | 4 | 4 | | 3327632 | 4 | 4 | | 3327642 | 4 | 4 | | 3327652 | 4 | 4 | | 3327662 | 4 | 4 | +---------+-----+--------+ 5 列セット (15.98 秒) 同じ目的を達成するために、通常は次のように書き直します。 mysql> select * from test a 内部結合 (select id from test where val=4 limit 300000,5) b on a.id=b.id; +---------+-----+--------+---------+ | id | val | ソース | id | +---------+-----+--------+---------+ | 3327622 | 4 | 4 | 3327622 | | 3327632 | 4 | 4 | 3327632 | | 3327642 | 4 | 4 | 3327642 | | 3327652 | 4 | 4 | 3327652 | | 3327662 | 4 | 4 | 3327662 | +---------+-----+--------+---------+ セット5行(0.38秒) 時間の違いは明らかです。 なぜ上記のような結果が表示されるのでしょうか? インデックス リーフ ノード データが照会されます。 次の図のようになります。 上記のように、インデックス ノードを 誰かが必ずこう尋ねるでしょう: インデックスは最初に使用されるので、最初にインデックス リーフ ノードに沿って必要な最後の 5 つのノードまでクエリを実行し、次にクラスター化インデックス内の実際のデータをクエリするのはなぜですか。これには、次の図のプロセスと同様に、5 つのランダム I/O のみが必要です。 確認済み: 上記の推論を確認するために実際にいくつかの操作を実行してみましょう。 私はこれを間接的にしか確認できません: val=4 の制限 300000,5 のテストから * を選択 mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('val','primary') and TABLE_NAME like '%test%' group by index_name; 空セット (0.04 秒) 現在、 mysql> select * from test where val=4 limit 300000,5; +---------+-----+--------+ | id | 値 | ソース | +---------+-----+--------+ | 3327622 | 4 | 4 | | 3327632 | 4 | 4 | | 3327642 | 4 | 4 | | 3327652 | 4 | 4 | | 3327662 | 4 | 4 | +---------+-----+--------+ セット5列(26.19秒) mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('val','primary') and TABLE_NAME like '%test%' group by index_name; +------------+-----------+ | インデックス名 | カウント(*) | +------------+-----------+ | プライマリ | 4098 | | 値 | 208 | +------------+-----------+ セットに2行(0.04秒) この時点で、 mysqladmin シャットダウン /usr/local/bin/mysqld_safe & mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('val','primary') and TABLE_NAME like '%test%' group by index_name; 空セット (0.03 秒) SQL を実行します: mysql> select * from test a 内部結合 (select id from test where val=4 limit 300000,5) b on a.id=b.id; +---------+-----+--------+---------+ | id | val | ソース | id | +---------+-----+--------+---------+ | 3327622 | 4 | 4 | 3327622 | | 3327632 | 4 | 4 | 3327632 | | 3327642 | 4 | 4 | 3327642 | | 3327652 | 4 | 4 | 3327652 | | 3327662 | 4 | 4 | 3327662 | +---------+-----+--------+---------+ セットに5行(0.09秒) mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('val','primary') and TABLE_NAME like '%test%' group by index_name; +------------+-----------+ | インデックス名 | カウント(*) | +------------+-----------+ | プライマリ | 5 | | 値 | 390 | +------------+-----------+ セットに2行(0.03秒) 2 つの違いは明らかです。最初の SQL は 4098 のデータ ページを そして、これは問題を引き起こします。あまりホットではないデータ ページを大量に 発生した問題: 再起動のたびに これで、MySQL で limit を使用するとパフォーマンスに影響する理由に関するこの記事は終了です。MySQL で limit を使用するとパフォーマンスにどのような影響があるかの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Zabbix カスタム監視 nginx ステータス実装プロセス
この記事の例では、クリックして切り替える機能を実装するためのJavaScriptの具体的なコードを参...
仮想化とコンテナ化は、クラウドベースのプロジェクトでは避けられない 2 つの問題です。仮想化は純粋な...
問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...
目次vuex 永続性要約するvuex 永続性vuex: ブラウザを更新すると、vuexの状態は初期状...
メインライブラリの実行 CREATE DATABASE test CHARACTER SET utf...
まずは違いについて話しましょう最後に、書き換えられたルールは、次の場所と一致させるために書き換えられ...
QQtabBar の BEMまず、BEMとはどういう意味でしょうか? BEM は、ブロック、要素、修...
基本的な概念: Macvlanの動作原理: Macvlan は、Linux カーネルでサポートされて...
データ表示は、常にあらゆる職業の人々が求めているものです。特にフロントエンド開発業界では、データを表...
例を通して、MySQL のデータ テーブル送信のクエリが遅い問題の解決策を共有しました。最近、コード...
この記事では、例を使用して、MySQL トリガーの原理と使用方法を説明します。ご参考までに、詳細は以...
1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...
序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...
暗号化と復号化は、通信のセキュリティを確保するための重要な手段です。すでに多くの暗号化アルゴリズムが...
DOSBox を使用すると、Windows で DOS をシミュレートし、楽しい作業を行うことができ...