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 のグローバル ウォーターマーク実装例

推薦する

Vueはアコーディオン効果を実装する

この記事の例では、アコーディオン効果を実現するためのVueの具体的なコードを参考までに共有しています...

MySQL Innodbの主な機能挿入バッファ

目次挿入バッファとは何ですか?挿入バッファのトリガー条件は何ですか?なぜ一意のインデックスにできない...

シャドウソックスを使用してLAN透過ゲートウェイを構築する

目次dnsmasq をインストールして設定するChinaDNS をインストールして設定するshado...

Reactはページング効果を実装する

この記事では、Reactでページング効果を実現するための具体的なコードを参考までに紹介します。具体的...

マークアップ言語 -

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

Vueページの画像が表示されない問題の解決方法

新しいバージョンの設定インターフェースを作る際に、vueフレームワークを使用して実装しました。ページ...

docker redis5.0 clusterの実装 クラスタ構築

システム環境: Ubuntu 16.04LTSこの記事では、6 つの Docker コンテナを使用し...

MySQL トランザクション、分離レベル、ロックの使用例の分析

この記事では、例を使用して、MySQL トランザクション、分離レベル、およびロックの使用について説明...

CSS で要素を垂直方向に中央揃えする 7 つの方法

【1】中央の要素の幅と高さを知る絶対値 + 負のマージンコードの実装 .wrapBox5{ 幅: 3...

Vue3でアイコンを使用する2つの例

目次1. SVGを使用する2. fontAwesomeを使用する3 ソース4 結論テクノロジースタッ...

LINUX での IPTABLES ファイアウォールの基本的な使用方法のチュートリアル

序文パブリック IP を持つ本番 VPS の場合、必要なポートのみが開かれ、IP とポートを制御する...

MySQL 8.0.14 のインストールと設定方法のグラフィックチュートリアル (一般)

MySQLサービス8.0.14のインストール(一般)の参考までに、具体的な内容は次のとおりです。イ...

MySQL オンライン DDL ツール gh-ost 原理分析

目次1. はじめに1.1 原則1.2 プロセス1.3 特徴1.4 githubアドレス2. テスト環...

スライド効果を実現するためのネイティブJavaScript

ページ、特にホームページを作成するときは、通常、Web サイト全体の他のメイン ページにリンクできる...

WeChatアプレットに2048ミニゲームを実装する詳細なプロセス

レンダリング サンプルコード今日は、WeChat アプレットを使用して 2048 ゲームを実装します...