MySQL カーディナリティ統計の簡単な分析

MySQL カーディナリティ統計の簡単な分析

1. カーディナリティとは何ですか?
カーディナリティとは、MySQL テーブルの列内の異なる値の数を指します。

このタイプのインデックスが一意である場合、カーディナリティ = 行数になります。

この列が性別で、列挙型に男性と女性のみが含まれる場合、そのカーディナリティは2です。

カーディナリティが高いほど、列をインデックスする価値が高くなります。 MySQL 実行プランでは、カーディナリティに基づいてインデックスも選択されます。

テーブル内の各列のカーディナリティは、次のように確認できます。

次の典型的な例を見てみましょう。
性別という列があります。性別列に格納される値は男性か女性のいずれかであり、その最大カーディナリティは 2 です。
性別のインデックスを作成する必要はありません。性別に基づくクエリの速度を向上させるために、MySQL は選択した新しいインデックスに対してまったく新しい B+ ツリーを作成するからです。しかし、性別には 2 つの値しかありません。MySQL の場合、指定した列に B+Tree インデックスを作成しても、実際にクエリを実行すると、バイナリ クエリは最大で 1 つしか実行されず、残りの操作はトラバーサルのみ実行できるため、性別にインデックスを作成しても意味がありません。

2. InnoDB はいつカーディナリティを更新しますか?
パラメータ: innodb_stats_auto_recalc は、MySQL がこの永続情報を積極的に再計算するかどうかを制御します。デフォルトは、true の場合は 1、false の場合は 0 です。
デフォルトでは、テーブル内の行が 10% 以上変更されると、カーディナリティ情報が再計算されます。

3. ベース数は推定される

ベース番号はリアルタイムで更新されません。そしてそれはサンプリングを通じて推定された値です!

ベースの式が何であるかについては、それは重要ではないかもしれません。

これはデータ ページをランダムにサンプリングして計算された推定値であることを理解することが重要です。

ランダムにサンプリングされるページの数は、パラメータ innodb_stats_persistent_sample_pages で設定でき、デフォルト値は 20 です。

つまり、基本値は正確ではなく、計算結果も毎回大きく異なる可能性があります。

4. 永続的なカーディナリティ

パラメータ innodb_stats_persistent を使用して、カーディナリティが永続化されるかどうかを制御できます。デフォルト設定はオフです。

もちろん、単一のテーブルに対して STATS_PERSISTENT=1 を設定すると、その innodb_stats_persistent は自動的に有効になります。

これを有効にする利点は、MySQL を再起動してもこの値が再計算されないため、再起動プロセスが高速化されることです。

5. ベースをアクティブに更新するにはどうすればいいですか?

次の SQL を実行すると、InnoDB がカーディナリティを更新します (カーディナリティが更新されることに気付いていない場合でも)。

そのため、ビジネスピークの少ない時間帯を選ぶようにしてください

テーブルtableNameを分析します。

サンプル数が少なすぎると、計算された基数は非常に間違ったものになります。これにより、MySQL オプティマイザが間違ったインデックスを選択する可能性が高くなります。ここで値を適切に増やすことができます。ただし、あまり大きくしすぎると、ANALYZE TABLE の実行が遅くなる可能性があります。

逆に、ANALYZE TABLE の実行は遅すぎます。パラメータ innodb_stats_persistent_sample_pages の値を適切に調整できます。ただし、これにより基数の計算が不正確になる可能性があります。

両者の関係をバランスさせる方法がない場合。 ANALYZE TABLE の複雑さを軽減するには、テーブル内のインデックス列の数を減らすか、パーティションの数を制限することを検討してください。主キー列は各非一意のインデックスに追加されるため、テーブルの主キーの列数も重要です。

参照:

永続統計

テーブルの複雑さを分析する

上記は、MySQL カーディナリティ統計の詳細の簡単な分析です。MySQL カーディナリティ統計の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析
  • MySQL関連のツールをいくつかお勧めします
  • MySQL の lru リンク リストの簡単な分析
  • MySQL クエリ キャッシュとバッファ プール
  • メニューノードのすべての子ノードを再帰的に検索する MySQL メソッド
  • MySQL テーブルスペースとは何ですか?
  • MySQL の遅いクエリを見つける方法
  • MySQL フラッシュリストとダーティページフラッシュメカニズム

<<:  JavaScript ウェブページ入門開発詳細説明

>>:  Dockerサーバーのストレージリソースプール不足問題の解決

推薦する

Centos7.3は起動時に自動的に起動または指定されたコマンドを実行します

Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...

Rancher で Kubernetes 用の標準化された VMware イメージを構築する方法

Kubernetes を学習するときは、Kubernetes 環境で練習する必要があります。ただし、...

少なくともn日間連続してログインしているユーザーに対するSQLクエリ

MySQL ツールを使用して、3 日間連続する例を見てみましょう。 1. SQL テーブルを作成しま...

Tencent Cloud Server Centosにデータディスクをマウントする方法

まず、ハードディスクデバイスにデータディスクがあるかどうかを確認します # まずfdisk -lを実...

Django+vue 登録とログインのサンプルコード

登録するフロントエンドは、vue の axios を使用して値を渡し、取得したアカウントとパスワード...

ファイアウォールルールの設定とコマンド(ホワイトリスト設定)の詳しい説明

1. ファイアウォールルールを設定する例1: ポート8080を外部に公開する ファイアウォールコマン...

Dockerコンテナのk8sデプロイメントの実装

環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...

TypeScriptジェネリックの使用

目次1. 使いやすい2. 関数内でジェネリックを使用する3. クラス内でジェネリックを使用する4. ...

JavaScriptは行削除機能を備えたテーブルを動的に生成します

この記事の例では、テーブルを動的に生成したり行を削除したりするためのJavaScriptの具体的なコ...

Linuxファイルを表示するコマンドの詳細な説明

Linuxファイルを表示する方法ファイルの内容を表示するコマンド: catは最初の行からコンテンツを...

CentOS での MySQL ワークベンチのインストールと設定のチュートリアル

この記事では、MySQL Workbenchのインストールと設定のチュートリアルを参考までに紹介しま...

Linux 仮想ホストで SourceGuardian (sg11) 暗号化コンポーネントを有効にする詳細な手順

注: sg11 弊社では Linux システム仮想ホストのセルフインストールのみサポートしております...

Vue フロントエンド開発における keepAlive の使用方法の詳細な説明

目次序文keep-avlive フック関数keep-avliveはどのコンポーネントをキャッシュする...

LinuxテキストエディタVimの詳しい説明

Vim は強力なフルスクリーン テキスト エディターであり、Linux/UNIX で最も一般的に使用...

Spring Boot 2.4 の新機能、ワンクリックビルド、Docker イメージプロセスの詳細説明

背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...