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サーバーのストレージリソースプール不足問題の解決

推薦する

iframeリフレッシュ方式の方が便利

iframeを更新する方法1. 更新するには、JavaScriptのdocument.fr.loca...

マウスを動かしたときに画像のズーム効果とゆっくりとした遷移​​効果を実現するCSSのサンプルコード

transform:scale()比例したズームインまたはズームアウトを実現できます。 transi...

HTMLとリソースがどのように読み込まれるかを理解します

このブログのすべてのコンテンツは、クリエイティブ コモンズ ライセンスの下でライセンスされています。...

MySQL 5.7 でルートパスワードを忘れた後に変更する方法の詳細なチュートリアル

序文長い間、MySQL のアプリケーションおよび学習環境は MySQL 5.6 以前のバージョンであ...

HTML は、Web ページの作成者が学習して習得しなければならないものです。

HTML を学ぶメリットは何ですか? 1: ウェブサイトやブログのウェブ構造を簡単に変更できます。...

MySQL における varchar 型と char 型の違い

目次前述のVARCHAR型VARCHAR適用可能な状況CHAR型テストVARCHAR(5)とVARC...

Git サーバーを使用してデバッグ ブランチを表示し、修正する方法を 1 日 1 分で学習します。

デバッグブランチプロジェクトの通常の開発中に、以前にリリースされたバージョンにバグがある場合がありま...

SpringBoot プロジェクトの Docker クイック デプロイメントの紹介

1. Dockerをインストールするまず Linux 環境を開き、次のコマンドを入力してインストール...

vue+tsは要素のマウスドラッグの効果を実現します

この記事の例では、要素のマウスドラッグ効果を実現するためのvue+tsの具体的なコードを参考までに共...

MySQL Installer 8.0.21 インストール チュートリアル (画像とテキスト付き)

1. 理由新しいシステムに MySQL を再インストールする必要があったので、将来詳細を忘れた場合...

Linux での umask の使用に関する詳細な説明

私は最近 Linux を学び始めました。Ma Ge の umask に関する Linux コースを読...

MySQLにおけるMTRの概念

MTR は Mini-Transaction の略です。名前が示すように、これは「最小のトランザクシ...

Nginx でアクセス頻度、ダウンロード速度、同時接続数を制限する方法

1. アクセス頻度、同時接続、ダウンロード速度を制限するために使用されるモジュールと命令の概要ngx...

Apple の携帯電話のロックを解除するときに光沢のあるフォント効果を実現するために CSS3 を使用する例

0. はじめに2016 年 8 月 18 日 今日、iPhone をスライドさせてロックを解除すると...

Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します

第1章: keepalivedの紹介VRRP プロトコルの目的は、静的ルーティングの単一点障害問題を...