MySQL クラスター化インデックスのページ分割原理の分析例

MySQL クラスター化インデックスのページ分割原理の分析例

この記事では、MySQL クラスター化インデックスのページ分割を例を使って説明します。ご参考までに、詳細は以下の通りです。

MySQL では、MyISAM は非クラスター化インデックスを使用し、InnoDB ストレージ エンジンはクラスター化インデックスを使用します。

クラスター構造の特徴:

  • 主キーに基づいてエントリをクエリする場合、行に戻る必要はありません(データは主キーノードの下にあります)
  • 不規則なデータが挿入されると、ページ分割が頻繁に発生します。

ページ分割はなぜ発生するのでしょうか?

これは、クラスター化インデックスがバランスバイナリツリーアルゴリズムを使用し、各ノードが主キーに対応する行のデータを格納するためです。挿入されたデータの主キーが自己増加していると仮定すると、バイナリツリーアルゴリズムは特定のノードにデータをすばやく追加し、他のノードを移動する必要はありません。ただし、不規則なデータが挿入されると、挿入ごとにバイナリツリーの以前のデータの状態が変更されます。これによりページが分割されます。

テスト:

2つのテーブルを作成する

テーブルt8を作成します(
id int 主キー、
c1 varchar(500)、
c2 varchar(500)、
c3 varchar(500)、
c4 varchar(500)、
c5 varchar(500)、
c6 varchar(500)
) エンジン innodb 文字セット utf8;
テーブルt9を作成します(
id int 主キー、
c1 varchar(500)、
c2 varchar(500)、
c3 varchar(500)、
c4 varchar(500)、
c5 varchar(500)、
c6 varchar(500)
) エンジン innodb 文字セット utf8;

10,000 個の不規則な主キー データと 10,000 個の通常の主キー データを挿入する PHP スクリプトを記述して、違いを確認します。

<?php
時間制限を設定する(0);
ローカルホストに接続します。
mysql_query('テストを使用します;');
// 主キーを自己増分する $str = str_repeat('a', 500);
開始時刻をマイクロタイムに設定します。
($i=1;$i<=10000;$i++) の場合{
 mysql_query("t8 値に挿入($i、'$str'、'$str'、'$str'、'$str'、'$str'、'$str')");
}
終了時間 = マイクロタイム(true);
echo $endTime-$startTime.'<br/>';
//順序付けられていない主キー $arr = range(1, 10000);
シャッフル($arr);
開始時刻をマイクロタイムに設定します。
foreach($arr を $i として){
 mysql_query("t9 値に挿入($i、'$str'、'$str'、'$str'、'$str'、'$str'、'$str')");
}
終了時間 = マイクロタイム(true);
echo $endTime-$startTime.'<br/>';

テスト結果グラフ

10,000 ルールのデータ: 998 秒 = 16 分
10,000 個の不規則データ: 1939 秒 = 32 分

結論は:

クラスター化インデックスの主キー値は、ランダムな値ではなく、継続的に増加する値にする必要があります (ランダムな文字列または UUID を使用しないでください)。そうしないと、多数のページ分割とページ移動が発生します。 InnoDB を使用する場合、次のように定義するのが最適です。

id int unsigned primary key auto_increment

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL 学習チュートリアル クラスター化インデックス
  • MySQLのクラスタ化インデックスと非クラスタ化インデックスの詳細な説明
  • MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する

<<:  Tomcat 実行時の JVM エンコーディングの問題を修正

>>:  Vue のグローバル ウォーターマーク実装例

推薦する

Dockerプライベート倉庫の構築と利用の詳細説明

イメージは hub.docker.com に保存できますが、ネットワーク速度が比較的遅いです。内部環...

独自の Docker イメージを作成して Dockerhub にアップロードする方法

1. まず、自分のdockerhubアカウントを登録します。登録アドレス: https://hub....

HTML テキストフォーマットの簡単な例 (詳細な説明)

1. テキストの書式設定: この例では、HTML ファイル内のテキストを書式設定する方法を示します...

Mysql 5.7.19 無料インストール版 (64 ビット) の設定方法に関する詳細なチュートリアル

公式サイトから mysql-5.7.19-winx64 をダウンロードします。これはシステムの 64...

Centos7 で mysqldump を使用して MySQL データベースの毎日の自動バックアップを作成する

1. 要件:データベースのバックアップは、実稼働環境にとって特に重要です。データベースのバックアップ...

el-tree での不完全なテキスト表示の解決策

目次方法1: 水平スクロールバーを設定する最も簡単な方法方法2(新規):ドラッグバーを追加して外側の...

MySQLのスレッド実行の急増とクエリの遅延の問題を解決する

目次背景問題の説明原因分析CPUクエリが遅い接続数分析する拡大する総括する背景新年を迎える前は、一年...

Zabbix設定 DingTalkアラーム機能実装コード

必要Zabbix で DingTalk アラームを設定する方法は、Prometheus で Ding...

CSS3 でテキストの点滅効果を実現する 3 つの方法 サンプルコード

1. 透明度を変更してテキストを徐々に点滅させると、次のような効果が得られます。 <!DOCT...

Ubuntu に MySQL 5.7 をインストールし、データ ストレージ パスを構成する方法

1. MySQLをインストールするこの記事はAPT経由でインストールされており、インストールされてい...

MySQLからデータをインポートする際の不正なフォーマット、インポートの遅延、データ損失などの問題を迅速に解決します。

遅い問題を完全に解決したい場合は、MySQL を MySQL 8.0 にアップグレードすることをお勧...

MySQL の 3 つの Binlog 形式の概要と分析

1つ。 Mysql Binlog フォーマットの紹介 Mysql binlog ログには、State...

MySQLストレージフィールドタイプのクエリ効率についての簡単な理解

検索パフォーマンスは最速から最遅まで次のとおりです (私が聞いたところによると)。 1 番目: ti...

uniappがインターフェースドメイン名を動的に取得する方法を分析する

背景インターフェイス ドメイン名はハードコードされておらず、動的に取得されます。具体的な実装は、静的...

Mysqlのprepare前処理の具体的な使用法

目次1. 前処理2. 前処理塗布方法A. 例: B. 実行計画の変更を追跡するための前処理C. スト...